web-dev-qa-db-ja.com

ポインターをマップに格納する方法

私は必要なプロジェクトの1つに取り組んでいます

_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を使用してこれを行うことができるより良い方法はありますか

17
Venkata

私はそれをより読みやすくするためにこれを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));
23
Moo-Juice

挿入関数を使用する場合、std :: mapにはペアが必要です。

次の2つのオプションがあります。

myMap[strFileName] = pObj;

または:

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

myMap.insert(strFileName、pObj);

make_pair()insert()内で使用します

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

キーと値を引数として取るinsertメンバーはありません。インデックス演算子を使用するだけです:

myMap[fileName] = obj;
4
Steve M
map<string,MyObj*> myMap;

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

myMap[strFilename] = pObj;

うまく動作するはずです。マップをクリアしても、ポインタが指しているメモリが解放されないことに注意してください。

3
Strahd_za

挿入はペアを必要としています、次のようなことを試してください:

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

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

この場合、3つの要素がmに追加されます(キー「first」、「second」、「third」、および作成された3つのオブジェクト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 );

この場合、3つの要素がmに追加されます。最初の要素にはキー「first」と値MyObj(1)があり、2番目-キー「second」とMyObj(2)、3番目-キー「third」とMyObj(3)があります。

1

insert()を誤って呼び出しています。キーと値を別々に受け取るのではなく、次のようなペアを受け取ります。


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

Boost :: ptr_map()を試す

0