Как хранить указатели на карте
Я работаю над одним из проектов, для которого требуется
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
Ответы
Ответ 1
Я напечатал этот материал, чтобы сделать его более читаемым...
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);
Используйте make_pair()
внутри insert()
#include <utility>
//...
myMap.insert (std::make_pair(strFileName, pObj) ) ;
Ответ 4
Нет элемента insert
, который принимает ключ и значение в качестве аргументов. Просто используйте оператор индекса:
myMap[fileName] = obj;
Ответ 5
map<string,MyObj*> myMap;
string strFilename = "MyFile";
MyObj* pObj = new MyObj();
myMap[strFilename] = pObj;
Должно работать нормально.
Просто помните, что очистка карты не освобождает память, на которую указывают указатели.
Ответ 6
Вставка хочет пару, попробуйте что-то вроде этого:
mymap.insert ( pair<string,MyObj*>(strFilename,pObj) );
Ответ 7
Попробуйте boost:: ptr_map (из библиотеки boost:: ptr_container). И с boost:: assign library вам даже не нужно вызывать новое вручную:
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. Первый элемент имеет ключ "первый" и значение MyObj (1), второй - "второй" и "MyObj (2), третий -" третий "и MyObj (3).
Ответ 8
Вы неправильно вызываете insert()
. Он не принимает ключ и значение отдельно, он принимает пару, подобную этой:
myMap.insert(pair < string, MyObj* > (strFileName, pObj));
Ответ 9
Попробуйте boost:: ptr_map()