我有
std::vector<MyObject> obs;
//fill obs...
std::vector<MyObject*> obsA;
std::vector<MyObject*> obsB;
for (MyObject &p: obs){
if (p.type == "A"){
obsA.push_back(p);
}else{
obsB.push_back(p);
}
}
我正在尝试创建一些对象矢量的2个子集。我希望子集是指针,因此对obsA或obsB中的对象所做的任何更改都会反映在主要的obs矢量中。但是,当我尝试运行代码时,我收到以下错误:
src/main.cpp:55:26: error: no matching function for call to ‘std::vector<MyObject*>::push_back(MyObject&)’
我认为有&amp;在变量之后应该给该变量的地址,并且因为obsA和obsB以及指针的向量,它应该有效地将MyObject的地址插入那里。我在这里做错了什么?
答案 0 :(得分:1)
我认为有&amp;在变量之后应该给该变量的地址,并且因为obsA和obsB以及指针的向量,它应该有效地将MyObject的地址插入那里。我在这里做错了什么?
您问题的最直接答案是以下列方式修改它。 p
只是对obs
中某个元素的引用。 &p
为您提供了内存中{em>地址到p
所引用的位置,这就是指针需要的内容。
for (MyObject &p: obs){
if (p.type == "A"){
obsA.push_back(&p);
}else{
obsB.push_back(&p);
}
}
更大的问题是为什么你这样做。这似乎很可能会破坏并做坏事。无论何时修改原始向量obs
(通过添加或删除元素),obsA
和obsB
中的所有指针都可能无效(即,它们不再指向obs
中的正确位置{1}})。更改向量obs
的大小可能会导致内存重新分配并将obs
的内容移动到内存中的新位置,该位置与obsA
和{的元素位置不同{1}}正指向。然后obsB
或obsA
的任何进一步使用将导致未定义的行为,这将导致异常行为和可能的崩溃。
有潜在的替代方案。例如,将obsB
的内容替换为obs
可能会有所帮助,但如果您从std::shared_ptr<>
中删除一个元素,则无法在{{{}}中正确清理该元素1}}或obs
(即,obsA
或obsB
仍将该对象保留在内存中,并且无法正确删除)。 obsA
和obsB
的组合可以起作用:
std::shared_ptr
但这变得非常复杂,所以你可能想重新考虑一下你的设计。
答案 1 :(得分:0)
你需要
obsA.push_back(&p);
强烈建议使用shared_ptr而不是原始指针