STL map 存储搜索到的键

Posted

技术标签:

【中文标题】STL map 存储搜索到的键【英文标题】:STL map stores searched keys 【发布时间】:2009-05-13 18:14:25 【问题描述】:

我刚刚发现,当我搜索这样的地图时:

  std::map<std::string, int> aMap;

我搜索的键开始成为地图的一部分。在上述情况下,这些值存储为零。如果是指针,它将值存储为 0 值指针

我正在使用 [] 运算符进行搜索,例如:

  int a = aMap["some key"];

你能确认一下吗?我想我误解了 [] 运算符。是在做作业吗?!

我在哪里可以找到这类“功能”的 STL 文档?

【问题讨论】:

【参考方案1】:

您是否使用 [] 运算符搜索它?如果是这样,那么是的,这是定义的行为。

如果你不想要这种行为,你应该使用 'find' 方法。

Nicolai Josuttis 的书是 STL 的一个很好的参考。

【讨论】:

【参考方案2】:

如果您使用 [] 运算符查看地图,那么,是的,您将生成默认对象。另一方面,如果您使用“查找”,则不会。这是因为 [] 运算符必须返回对映射中对象的引用,因此它别无选择,只能在没有对象时生成一个。

【讨论】:

【参考方案3】:

这背后的原因是: [] 定义为

T& operator[](KEY k)

引用永远不能为 NULL,因此必须返回一些值。 STL 通过插入一个默认的初始化元素来解决这个问题。

【讨论】:

【参考方案4】:
int a = aMap["some key"];

这里的map检查键“some key”是否已经存在于map中:

如果是,则参考 返回“Some key”对应的值。 如果映射中不存在“某个键”,则 键“Some Key”以默认值插入到地图中。 新插入值的引用将是 返回。

测试map中是否存在key(不添加key到map)的正确方法是:

std::map<key,value>::iterator iter = myMap.find("Some Key");
if( iter != myMap.end())

 //key exists

else

 //no key

【讨论】:

【参考方案5】:

你怎么搜索???

if(!aMap[key]) // not found

这是不正确的,一旦您通过 operator[] 访问地图,就会创建适当的位置并返回参考。

你需要使用

if(aMao.find(key)==aMap.end()) // not found

【讨论】:

【参考方案6】:

听起来您正在使用括号运算符,即

if (aMap["string"] == something)

不要那样做。相反,请使用 map::find。

如果键不存在,括号运算符将自动将键插入映射,使用值部分的默认值。

【讨论】:

【参考方案7】:

如果搜索是指使用运算符[],如下所示:

if ( m["foo"] == 42 ) 
  // found

else 
  // not

然后是的,如果“foo”不存在,这将为它创建一个条目。出于这个原因,您通常应该避免将 operator[] 用于映射,而应使用命名函数 sfind() 和 insert()。

至于在哪里可以找到有关这种行为的信息,标准库中最好的书是The C++ Standard Library by Nicolai Josuttis。

【讨论】:

以上是关于STL map 存储搜索到的键的主要内容,如果未能解决你的问题,请参考以下文章

[STL与数据结构]搜索二叉树

[STL与数据结构]搜索二叉树

[MSTL] lc981. 基于时间的键值存储(设计+哈希表+map二分查找+代码技巧)

为不同的键存储相同的值。 [爪哇]

LeetCode 981 基于时间的键值存储[Map] HERODING的LeetCode之路

Map 接口简明