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_ptr
然后
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});
}