选择和修改嵌套向量中的条目的最佳实践
best practice to select and modify entries in nested vectors
我正在寻找一种有效的方法来解决以下(大概很简单(的问题:
- 我有一个
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
将变为空(。
但问题是,如果您在已经创建了指向B
s 的指针后向A
添加新的B
。如果A
的v
向量没有足够的容量来存储新插入的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; });
}
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 独立读取-修改-写入顺序
- 派生类销毁的最佳实践是什么
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 选择和修改嵌套向量中的条目的最佳实践
- 避免使用大量全局变量或使其易于访问和修改的最佳方法
- 修改Boost多索引项的非索引字段的最佳方法:modify vs mutable
- C++是修改这些对象的向量中所有对象的给定成员的最佳方法
- 读取和修改文件的最佳方式(c++)