gpt4 book ai didi

c++ - 来自另一个 vector 的对象指针的 vector

转载 作者:行者123 更新时间:2023-11-28 04:47:18 25 4
gpt4 key购买 nike

我有

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);
}
}

我正在尝试创建一些对象 vector 的 2 个子集。我希望子集是指针,以便对 obsA 或 obsB 中的对象所做的任何更改都反射(reflect)在主 obs vector 中。但是,当我尝试运行代码时,出现以下错误:

src/main.cpp:55:26: error: no matching function for call to ‘std::vector<MyObject*>::push_back(MyObject&)’

我认为在变量后加上 & 应该给出该变量的地址,并且由于 obsA 和 obsB 以及指针 vector ,将 MyObject 的地址插入其中应该是有效的。我在这里做错了什么?

最佳答案

I thought that having & after a variable should give the address to that variable, and since obsA and obsB and vector of pointers, that it should be valid to insert an address of a MyObject into there. What am I doing wrong here?

您的问题最直接的答案是按以下方式修改它。 p只是对 obs 中某些元素的引用. &p给你内存中的地址 p正在引用,这是指针所需要的。

for (MyObject &p: obs){
if (p.type == "A"){
obsA.push_back(&p);
}else{
obsB.push_back(&p);
}
}

更大的问题是为什么您要这样做。这似乎很可能会破坏并做坏事。任何时候修改原始 vector obs (通过添加或删除元素),obsA 中的所有指针和 obsB可以无效(即,它们不再指向 obs 中的正确位置)。更改 vector 的大小 obs可能导致内存重新分配并移动 obs 的内容到内存中的一个新位置,这与 obsA 的元素所在的位置不同和 obsB指着。然后进一步使用 obsAobsB会导致未定义的行为,这会导致异常行为和可能的崩溃。

有潜在的替代品。例如替换obs的内容与 std::shared_ptr<> s 可以提供帮助,但是如果您从 obs 中删除一个元素这不会在 obsA 中正确地清理该元素或 obsB (即 obsAobsB 仍会将该对象保存在内存中,并且不会被正确删除)。 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);
}
}

但这变得非常复杂,因此您可能需要重新考虑一下您的设计。

关于c++ - 来自另一个 vector 的对象指针的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49019598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com