web-dev-qa-db-de.com

wie man Zeiger in der Karte speichert

Ich arbeite an einem der Projekte, die es erfordern

class MyObj;

map<string, MyObj*> myMap;

Die Logik ist hier, um den Dateinamen der MyObj-Klasse zuzuordnen.

Wenn ich versuche folgendes einzufügen

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

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

keine passende Funktion zum Aufruf von '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*)'

Kann mir bitte jemand helfen, wie man das löst. Gibt es eine bessere Möglichkeit, dies mit STL zu tun?

15
Venkata

Ich habe dieses Zeug getippt, um es lesbarer zu machen ...

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));
20
Moo-Juice

für std :: map ist ein Paar erforderlich, wenn Sie die Einfügefunktion verwenden.

Sie haben zwei Möglichkeiten:

myMap[strFileName] = pObj;

Oder:

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

myMap.insert (strFileName, pObj);

Verwenden Sie make_pair() inside insert()

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

Es gibt kein Mitglied insert, das einen Schlüssel und einen Wert als Argumente verwendet. Verwenden Sie einfach den Indexoperator:

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

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

myMap[strFilename] = pObj;

Sollte gut funktionieren. Denken Sie daran, dass das Löschen der Karte nicht den Speicher freigibt, auf den die Zeiger zeigen.

2
Strahd_za

Einfügen möchte ein Paar, versuchen Sie es wie folgt:

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

Versuchen Sie es mit boost :: ptr_map (aus der boost :: ptr_container-Bibliothek). Und mit boost :: assign library müssen Sie new nicht einmal manuell aufrufen:

class MyObj {
    MyObj() { /* some... */ }
};

typedef boost::ptr_map< string, MyObj > MyMap;
MyMap m;

using namespace boost::assign;

ptr_map_insert( m )( "first" )( "second" )( "third" );

In diesem Fall werden drei Elemente in m hinzugefügt (mit den Tasten "first", "second" und "third" und mit drei erstellten Objekten MyObj ()).

Oder:

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

In diesem Fall werden drei Elemente in m hinzugefügt. Das erste Element hat den Schlüssel "first" und den Wert MyObj (1), den zweiten Schlüssel "second" und MyObj (2), den dritten Schlüssel "third" und MyObj (3).

1

Sie rufen insert() falsch an. Es wird kein Schlüssel und kein Wert separat verwendet, sondern ein Paar wie das folgende:


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

Versuche boost :: ptr_map ()

0