如何在地图中存储指针

时间:2010-11-03 14:59:32

标签: c++ stl map

我正在开展一个需要

的项目
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<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, void*, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, void*> > >::insert(std::string&, void*)'

的匹配函数

任何人都可以帮我解决这个问题。有没有更好的方法我们可以使用STL

来做到这一点

9 个答案:

答案 0 :(得分:21)

我已经输入了这些东西以使其更具可读性......

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));

答案 1 :(得分:13)

使用插入函数时,

std :: map需要一对。

您有两种选择:

myMap[strFileName] = pObj;

或者:

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

答案 2 :(得分:7)

  

myMap.insert(strFileName,pObj);

insert()

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

答案 3 :(得分:3)

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

myMap[fileName] = obj;

答案 4 :(得分:2)

map<string,MyObj*> myMap;

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

myMap[strFilename] = pObj;

应该工作得很好。 只记得清除地图不会释放指针所指向的内存。

答案 5 :(得分:2)

插入需要一对,尝试这样的事情:

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

答案 6 :(得分:1)

尝试使用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),第三个键“第三个”和MyObj(3)。

答案 7 :(得分:0)

您正在正确呼叫insert()。它不需要单独使用键和值,它需要这样的一对:


myMap.insert(pair < string, MyObj* > (strFileName, pObj));

答案 8 :(得分:0)

尝试使用boost :: ptr_map()