【问题标题】:how to store pointers in map如何在地图中存储指针
【发布时间】:2011-05-04 13:19:42
【问题描述】:

我正在做一个需要

的项目
class MyObj;

map<string, MyObj*> myMap;

这里的逻辑是将文件名映射到 MyObj 类。

如果我尝试插入以下内容

string strFilename = "MyFile";
MyObj* pObj  = new MyObj();

myMap.insert(strFileName, pObj); // This line throwing following error.

没有匹配函数调用'std::map&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, void*, std::less&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;, std::allocator&lt;std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, void*&gt; &gt; &gt;::insert(std::string&amp;, void*)'

谁能帮我解决这个问题。有没有更好的方法可以使用 STL 来做到这一点

【问题讨论】:

  • 使用文本字段上方的工具栏按钮来控制问题的格式。

标签: c++ stl map


【解决方案1】:

我已经对这些内容进行了 typedef 以使其更具可读性...

typedef std::map<std::string, MyObj*> MyMap;
typedef std::pair<std::string, MyObj*> MyPair;

MyMap myMap;
string strFilename = "MyFile";
MyObj* pObj = new MyObj();
myMap.insert(MyPair(strFilename, pObj));

【讨论】:

    【解决方案2】:

    std::map 在使用插入函数时需要一对。

    您有两种选择:

    myMap[strFileName] = pObj;
    

    或者:

    myMap.insert(std::make_pair(strFileName,pObj));
    

    【讨论】:

      【解决方案3】:

      myMap.insert(strFileName, pObj);

      insert() 中使用make_pair()

      #include <utility>
      //...
      myMap.insert (std::make_pair(strFileName, pObj) ) ;
      

      【讨论】:

        【解决方案4】:

        没有将键和值作为参数的insert 成员。只需使用索引运算符:

        myMap[fileName] = obj;
        

        【讨论】:

        • 这不是真的。 insert 存在。查看 Prasoon 答案
        • 确实如此。 Prasoon 的回答证实了我所说的:没有insert 将键和值作为参数。他的回答使用了以 std::pair&lt;key,value&gt; 作为唯一参数的插入。
        【解决方案5】:
        map<string,MyObj*> myMap;
        
        string strFilename = "MyFile";  
        MyObj* pObj = new MyObj();
        
        myMap[strFilename] = pObj;
        

        应该可以正常工作。 请记住,清除地图不会释放指针指向的内存。

        【讨论】:

          【解决方案6】:

          Insert 想要一对,试试这样:

          mymap.insert ( pair<string,MyObj*>(strFilename,pObj) );
          

          【讨论】:

            【解决方案7】:

            尝试 boost::ptr_map(来自 boost::ptr_container 库)。使用 boost::assign 库,您甚至不需要手动调用 new:

            class MyObj {
                MyObj() { /* some... */ }
            };
            
            typedef boost::ptr_map< string, MyObj > MyMap;
            MyMap m;
            
            using namespace boost::assign;
            
            ptr_map_insert( m )( "first" )( "second" )( "third" );
            

            在这种情况下,m 中将添加三个元素(键为“first”、“second”和“third”,并带有三个创建的对象 MyObj())。

            或者:

            class MyObj {
                MyObj( int _i ) : i( _i ) { /* some... */ }
                int i;
            };
            
            typedef boost::ptr_map< string, MyObj > MyMap;
            MyMap m;
            
            using namespace boost::assign;
            
            ptr_map_insert( m )( "first", 1 )( "second", 2 )( "third", 3 );
            

            在这种情况下,三个元素将添加到 m 中。第一个元素有键“first”和值 MyObj(1),第二个 - 键“second”和 MyObj(2),第三个 - 键“third”和 MyObj(3)。

            【讨论】:

              【解决方案8】:

              您错误地调用了insert()。它不需要单独的键和值,它需要这样的一对:

              
              myMap.insert(pair &lt string, MyObj* &gt (strFileName, pObj));
              

              【讨论】:

              • 那不会编译,pair是一个模板类
              • 我一直忘记 需要转义。
              【解决方案9】:

              试试 boost::ptr_map ()

              【讨论】:

                【解决方案10】:

                emplace 如果容器中没有带有键的元素,则将一个新元素插入到使用给定 args 就地构造的容器中。

                myMap.emplace(strFileName, pObj);
                

                【讨论】:

                  猜你喜欢
                  • 2014-12-19
                  • 1970-01-01
                  • 2017-11-08
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-12-08
                  • 2011-04-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多