web-dev-qa-db-fra.com

comment stocker les pointeurs sur la carte

Je travaille sur l'un des projets qui nécessite

class MyObj;

map<string, MyObj*> myMap;

Ici, la logique est ici pour mapper le nom du fichier à la classe MyObj.

Si j'essaye d'insérer ce qui suit

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

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

pas de fonction correspondante pour l'appel à '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*)'

Quelqu'un peut-il m'aider s'il vous plaît comment résoudre ce problème. Existe-t-il un meilleur moyen de le faire en utilisant STL?

15
Venkata

J'ai tapé ce matériel pour le rendre plus lisible ...

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

std :: map nécessite une paire lorsque vous utilisez la fonction d'insertion.

Vous avez deux options, soit:

myMap[strFileName] = pObj;

Ou:

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

myMap.insert (strFileName, pObj);

Utilisez make_pair() inside insert()

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

Il n'y a pas de membre insert qui prend une clé et une valeur en tant qu'arguments. Il suffit d'utiliser l'opérateur d'index:

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

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

myMap[strFilename] = pObj;

Devrait fonctionner très bien. N'oubliez pas que l'effacement de la carte ne libérera pas la mémoire indiquée par les pointeurs.

2
Strahd_za

Insert veut une paire, essayez quelque chose comme ça:

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

Essayez boost :: ptr_map (à partir de la bibliothèque boost :: ptr_container). Et avec boost :: assign, vous n’avez même pas besoin d’appeler new manuellement:

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

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

using namespace boost::assign;

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

Dans ce cas, trois éléments seront ajoutés dans m (avec les clés "premier", "deuxième" et "troisième" et avec trois objets créés MyObj ()).

Ou:

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

Dans ce cas, trois éléments seront ajoutés dans m. Le premier élément a la clé "premier" et la valeur MyObj (1), la deuxième clé "deuxième" et MyObj (2), la troisième clé "troisième" et MyObj (3).

1
Denis Shevchenko

Vous appelez insert() de manière incorrecte. Il ne prend pas une clé et une valeur séparément, il faut une paire comme ceci:


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

Essayez boost :: ptr_map ()

0
Denis Shevchenko