选择和修改嵌套向量中的条目的最佳实践

best practice to select and modify entries in nested vectors

本文关键字:最佳 修改 嵌套 向量 选择      更新时间:2023-10-16

我正在寻找一种有效的方法来解决以下(大概很简单(的问题:

  • 我有一个A型向量.
  • A包含类型B的向量。
  • 我无法更改类A或设计 类A的向量(我无法使其成为指向A的指针向量 例如(。

我想要一个类B的向量,其中包含具有特殊属性的A向量中包含的所有B条目。

我想阅读有关该问题的内容有点复杂,但是如果您看到一个例子,可能会更容易理解:

#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的向量。

在堆栈上va不一定是问题,只要您将va移动到其新位置即可。在这种情况下,您的"移动到"矢量将在内部指向由"移动自"va矢量分配的存储空间(原始va将变为空(。

但问题是,如果您在已经创建了指向Bs 的指针后向A添加新的B。如果Av向量没有足够的容量来存储新插入的B,它将不得不将所有B元素重新分配到一个新的存储位置。这反过来又会改变所有这些B元素的地址。

因此,只要你能保证:

  • va被移动而不是复制。
  • 初始化后,不会向A添加新的B

假设可以保证上述内容,您可以按如下方式创建vb

std::vector<B *> vb;
for (auto & a : va) {
for (auto & b : a.v) {
if (b.n == 1) { vb.push_back(&b); }
}
}

或使用std::reference_wrapper

std::vector<std::reference_wrapper<B>> vb;
for (auto & a : va) {
std::copy_if(a.v.begin(), a.v.end(),
std::back_inserter(vb),
[](auto const & b) { return b.n == 1; });
}