存储指向映射中对象的指针

Store pointers to an object in map

本文关键字:对象 指针 映射 存储      更新时间:2023-10-16

我有一个指向vector<object>的矢量指针,所以const std::vector<object> vecPtr* = &vec;

现在我想以这种方式填充std::multimap<std::string, object*> dataMap;,其中keyobject.namevaluepointer 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));
                                                                          ^

我做错了什么?

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

为了避免复制对象,请考虑使用对象的引用。此外,考虑使用共享指针,例如std::shared_ptr(对于C++11)或boost::shared-ptr。一个好的风格是避免手动分配内存。让我们用STL提供的一种自动方式来完成它。

class Object{};
typedef boost::shared_ptr < Object > ObjectPtr;

然后

std::multimap < std::string, ObjectPtr > map; 

创建只使用对象的实例:

ObjectPtr obj = boost::make_shared < Object > ();

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