Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在映射中存储指向对象的指针_C++_Pointers_Object_Map - Fatal编程技术网

C++ 在映射中存储指向对象的指针

C++ 在映射中存储指向对象的指针,c++,pointers,object,map,C++,Pointers,Object,Map,我有一个指向向量的向量指针 const std::vector vecPtr*=&vec 现在我想以这种方式填写std::multimap dataMap其中键是对象。名称和值是指向对象的指针 我试过了 for(std::vector<object>::const_iterator it = data->cbegin(); it != data->cend(); ++it){ dataMap.insert(std::pair<std::string,

我有一个指向
向量的向量指针
const std::vector vecPtr*=&vec

现在我想以这种方式填写
std::multimap dataMap
其中
对象。名称
是指向对象的
指针

我试过了

for(std::vector<object>::const_iterator it = data->cbegin(); it != data->cend(); ++it){
        dataMap.insert(std::pair<std::string, object*>(it->name, &it));
}
for(std::vector::const_迭代器it=data->cbegin();it!=data->cend();+it){
insert(std::pair(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::pair::pair(const string&,std::vector::const_iterator*)”时没有匹配的函数
insert(std::pair(it->name,&it));
^
我做错了什么


<>我知道我用指针来复杂化我的生活,但是我想避免拷贝对象

以免拷贝对象考虑使用对象的引用。此外,考虑使用共享指针,如STD::SyrdY-PTR(C++ 11),或Booo::SyrdypTR。一种好的方式是避免手动分配内存。让我们以STL提供的自动方式来完成它

class Object{};
typedef boost::shared_ptr < Object > ObjectPtr;
类对象{};
typedef boost::shared_ptrObjectPtr;

然后

std::multimapmap;
创建对象的实例只需使用:

ObjectPtr obj = boost::make_shared < Object > ();
ObjectPtr obj=boost::使_共享();

&它是指向迭代器的指针,而不是指向对象的指针。如果要获取指向对象的指针,请编写
&*it

之后,您将看到一个错误,说明无法从
常量对象*
转换为
对象*
——这是因为您使用的是
常量迭代器
。所以,根据你的需要,你可以做两件事

dataMap
声明为
std::multimap dataMap,如果您不打算更改其中的对象

或使用迭代器

for (std::vector<object>::iterator it = data->begin(); it != data->end(); ++it) {
    dataMap.insert(std::pair<std::string, object*>(it->name, &*it));
}

你应该确切地说明你得到的错误是什么。这看起来很可疑。您将指针传递给迭代器。”dataMap.insert(std::pair(it->name,&it))*实际上是将迭代器的地址添加到映射中,而不是对象的指针。@Oncaphillis所以我应该在末尾添加一个*吗?
vecPtr
没有声明为指针,而且它似乎与问题的其余部分没有任何关系。智能指针听起来很有用,但我还没有了解他们:/
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});
}