[英]Vector of object pointers from another vector
我有
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&)’
我認為在變量后有&應該為該變量提供地址,並且由於obsA和obsB以及指針向量,在其中插入MyObject的地址應該是有效的。 我在這里做錯了什么?
我認為在變量后有&應該為該變量提供地址,並且由於obsA和obsB以及指針向量,在其中插入MyObject的地址應該是有效的。 我在這里做錯了什么?
對於您的問題,最直接的答案是通過以下方式對其進行修改。 p
只是對obs
某些元素的引用。 &p
為您提供p
所引用的內存中地址 ,這是指針所需的地址。
for (MyObject &p: obs){
if (p.type == "A"){
obsA.push_back(&p);
}else{
obsB.push_back(&p);
}
}
更大的問題是為什么您要這樣做。 這似乎很可能會中斷並做一些不好的事情。 每當您修改原始矢量obs
(通過添加或刪除元素)時, obsA
和obsB
所有指針都將失效(即,它們不再指向obs
的正確位置)。 更改向量obs
的大小可能會導致內存重新分配,並將obs
的內容移動到內存中的新位置,該位置與obsA
和obsB
元素所指向的位置不同。 然后,進一步使用obsA
或obsB
會導致未定義的行為,這將導致異常行為並可能導致崩潰。
有潛在的選擇。 例如,用std::shared_ptr<>
替換obs
的內容會有所幫助,但是如果您從obs
刪除一個元素,這將無法在obsA
或obsB
正確清理該元素(即, obsA
或obsB
會仍然將該對象保留在內存中,並且不會被正確刪除)。 std::shared_ptr
和std::weak_ptr
可以工作:
std::vector<std::shared_ptr<Obj>> obs;
std::vector<std::weak_ptr<Obj>> obsA, obsB;
for (auto p: obs){
if (p->type == "A"){
obsA.push_back(p);
}else{
obsB.push_back(p);
}
}
//... later
for( auto it = obsA.begin(); it != obsA.end(); it++ ) {
if(auto p = (*it).lock()) { // lock tests if the shared_ptr is still valid
p->otherMemberVariable = "edit"; //This will also edit the same element in the vector obs
else {
//the pointer was removed from obs, remove it here too
it = obsA.erase(it);
}
}
但這變得非常復雜,因此您可能需要重新考慮一下您的設計。
你需要
obsA.push_back(&p);
強烈建議您使用shared_ptr而不是原始指針
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.