簡體   English   中英

來自另一個向量的對象指針的向量

[英]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 (通過添加或刪除元素)時, obsAobsB所有指針都將失效(即,它們不再指向obs的正確位置)。 更改向量obs的大小可能會導致內存重新分配,並將obs的內容移動到內存中的新位置,該位置與obsAobsB元素所指向的位置不同。 然后,進一步使用obsAobsB會導致未定義的行為,這將導致異常行為並可能導致崩潰。

有潛在的選擇。 例如,用std::shared_ptr<>替換obs的內容會有所幫助,但是如果您從obs刪除一個元素,這將無法在obsAobsB正確清理該元素(即, obsAobsB會仍然將該對象保留在內存中,並且不會被正確刪除)。 std::shared_ptrstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM