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

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

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

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

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

  int a = aMap["some key"];

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

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

【问题讨论】:

    标签: c++ 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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-07-17
                  • 2018-12-04
                  • 1970-01-01
                  相关资源
                  最近更新 更多