我有一个指向vector<object>
的向量指针
const std::vector<object> vecPtr* = &vec;
现在我想以std::multimap<std::string, object*> dataMap;
填充key
object.name
value
pointer to an object
for(std::vector<object>::const_iterator it = data->cbegin(); it != data->cend(); ++it){
dataMap.insert(std::pair<std::string, object*>(it->name, &it));
}
。
我试过
error: no matching function for call to 'std::pair<std::basic_string<char>, object*>::pair(const string&, std::vector<object>::const_iterator*)'
dataMap.insert(std::pair<std::string, object*>(it->name, &it));
^
但是我收到了一个错误。
{{1}}
我做错了什么?
我知道我用指针使我的生活变得复杂,但我想避免复制对象
答案 0 :(得分:2)
为了避免复制对象,请考虑使用对象的引用。此外,请考虑使用共享指针,如std :: shared_ptr(对于C ++ 11)或boost :: shared_ptr。一个好的方法是避免手动分配内存。让我们以STL提供的自动方式进行。
class Object{};
typedef boost::shared_ptr < Object > ObjectPtr;
然后
std::multimap < std::string, ObjectPtr > map;
创建Object实例只需使用:
ObjectPtr obj = boost::make_shared < Object > ();
答案 1 :(得分:1)
&it
是指向迭代器的指针,而不是指向对象的指针。如果要获取指向对象的指针,请编写&*it
。
之后,您会看到一条错误消息,指出您无法从const object*
转换为object*
- 这是因为您使用的是const_iterator
。因此,根据您的需要,您可以做两件事。
如果您不打算更改其中的对象,请将dataMap
声明为std::multimap<std::string, const object*> dataMap;
。
或使用iterator
:
for (std::vector<object>::iterator it = data->begin(); it != data->end(); ++it) {
dataMap.insert(std::pair<std::string, object*>(it->name, &*it));
}
顺便说一句,这个循环可以改写为:
for (auto& a : *data) {
dataMap.insert({a.name, &a});
}