迭代多个嵌套向量
Iterate multiple nested vectors
假设有一个类a的向量具有一些特定的属性。其中,它有一个类型为B的向量。此外,B还有一个类型为vector的成员变量。迭代所有给定c的最好方法是什么?
简单的方法是使用嵌套循环。将C类型对象的属性foo更改为禁止诸如
之类的内容for (i=0; i<as.size(); i++)
for (j=0; j<as[i].bs.size(); j++)
for (k=0; k< as[i].bs[j].cs.size(); k++)
as[i].bs[j].cs[k].foo = bar
如果我必须以这种方式迭代C类的所有对象;也许有一个更复杂的身体;代码变得相当混乱。除了额外的标识之外,这些嵌套的for循环构造在代码中重复。
是否有更优雅的方法来做到这一点?我可以声明某种迭代器来做这个吗?我不得不使用c++ 98
-
你可以做一个功能:
template <typename T, typename F> void my_for_each(std::vector<std::vector<std::vector<T>>>& v, F f) { for (std::size_t i = 0; i != as.size(); i++) for (std::size_t j = 0; j != as[i].bs.size(); j++) for (std::size_t k = 0; k != as[i].bs[j].cs.size(); k++) f(as[i].bs[j].cs[k].foo); } } } }
要求函子使用它:
struct bar_assigner { bar_assigner(int bar) : bar(bar) {} operator () (int& e) const { e = bar; } int bar; }
像
一样使用my_for_each(as, bar_assigner(bar));
-
另一种选择是平坦你的数组(如果每个内部向量有相同的大小):
class Matrix3 { public: typedef std::vector<int>::iterator iterator; Matrix3(std::size_t a_size, std::size_t b_size, std::::size_t c_size) : a_size(a_size), b_size(b_size), c_size(c_size), v(a_size * b_size * c_size){} int& operator()(std::size_t i, std::size_t j, std::size_t k) { return b_size * c_size * i + c_size * j + k; } iterator begin() { return v.begin(); } iterator end() { return v.end(); } // ... private: std::size_t a_size; std::size_t b_size; std::size_t c_size; std::vector<int> v; };
和用法:
for (Matrix3::iterator it = m.begin(); it != m.end(); ++it) { *it = bar; }
-
第三种选择是创建自己的迭代器:
class Iterator3D { public: Iterator3D& operator ++() {/*..*/} int& operator *() {/*..*/} int* operator ->() { return &this->operator *(); } operator ==(const Iterator3D& rhs) const {/*..*/} private: std::vector<std::vector<std::vector<int>>>& v; std::size_t index_a; std::size_t index_b; std::size_t index_c; };
和用法:
for (Iterator3D it = my_begin(as); it != as_end(as); ++it) { *it = bar; }
相关文章:
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 选择和修改嵌套向量中的条目的最佳实践
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- 在C++中生成任意嵌套的向量
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 嵌套向量的缺点是什么?
- 如何通过迭代器访问向量中的嵌套对?
- 嵌套列表(字符串向量的向量)初始化失败
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- 删除嵌套向量中具有remove_if的元素
- 在循环访问嵌套向量时删除元素
- 使用嵌套循环搜索两个向量并查看其属性
- 如何在 C++ 中将结构类型向量数据输入到结构向量成员(嵌套结构向量)中
- C++:清除嵌套向量会导致奇怪的结果
- 如何在嵌套列表初始化中从map<><>中辨别向量?
- 类字符串和嵌套向量C
- 如何在C 中打印出嵌套向量的内容
- 如何在C++中生成任意嵌套的向量
- 使用嵌套向量动态分配方阵
- 在嵌套向量C 中获取特定元素