将指针存储到地图中的对象

时间:2014-10-23 13:28:48

标签: c++ pointers object map

我有一个指向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}}

我做错了什么?

我知道我用指针使我的生活变得复杂,但我想避免复制对象

2 个答案:

答案 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});
}