【发布时间】:2020-02-12 13:55:02
【问题描述】:
我正在寻找一种有效的方法来解决以下(可能很容易)问题:
- 我有一个
A类型的向量。 -
A类包含B类型的向量。 - 我无法更改课程
A或设计A类的向量(我无法将其设为指向A的指针向量 例如)。
我想要一个 B 类的向量,其中包含 B 的所有条目,这些条目包含在具有特殊属性的 A 向量中。
我想阅读这个问题有点复杂,但如果你看到一个例子可能更容易理解:
#include <vector>
#include <iostream>
using namespace std;
struct B {
int n;
double val;
};
struct A {
vector<B> v;
};
int main() {
// generate some dummy data:
A a1;
a1.v.push_back(B{1, 1.0});
a1.v.push_back(B{2, 2.0});
a1.v.push_back(B{1, 3.5});
A a2;
a1.v.push_back(B{2, 2.0});
a1.v.push_back(B{3, 1.0});
a1.v.push_back(B{1, 2.5});
// this is my initial situation: a vector of type A
vector<A> va;
va.push_back(a1);
va.push_back(a2);
// what I want to get is a vector of type B with all B values whose n == 1
vector<B> vb;
// possible solution to get all elements of B
for(auto &any : va){
for(auto &b : any.v){
if(b.n == 1){
vb.push_back(b);
}
}
}
for(const auto &any:vb){
cout << any.val << endl;
}
return 0;
}
问题:
我想获得B 类的向量而不复制每个元素。稍后,我需要修改向量B中的元素,它们也应该在向量A中修改(意思是,如果我更改vb[0].val = 100;,则va[0].v[0]中的条目也应该是100;
我考虑过使用指针来执行此操作,但我不确定这是否是个好主意,因为向量 va 的元素是在堆栈上而不是在堆上分配的。
** 编辑:**
我可以确保只要我需要B 的向量,我就不会以任何方式修改A 的向量。
【问题讨论】:
-
对不起,您无法避免复制。 C++ 不能以这种方式工作。您也许可以创建一个
std::reference_wrappers 的向量,并可能完成类似的事情,但是,就拥有Bs 的向量而言,没有办法避免复制。这也许是 Java 中对象的工作方式,但 C++ 不是 Java。 -
"因为向量 va 的元素是在栈上而不是在堆上分配的。" 向量元素永远不会在栈上。也许这就是你的误解:在
va.push_back(a1);之后,向量包含a1的副本,但不是a1本身 -
除了@idclev463035818 的评论:当您使用非拥有指针时,对象的存储类是什么并不重要。它们总是可以使用的。
-
...但考虑到指向元素的指针是不稳定的。即,如果您在向量中添加/删除某些内容,它们就会失效
-
稍后,我需要修改向量 B 中的元素,它们也应该在向量 A 中进行修改 你为什么不在需要的时候直接
for(auto &any : va){ for(auto &b : any.v){ if(b.n == 1){ do thing here } } }呢?