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 存储搜索到的键的主要内容,如果未能解决你的问题,请参考以下文章
[MSTL] lc981. 基于时间的键值存储(设计+哈希表+map二分查找+代码技巧)