非均匀多维数组的C++迭代
C++ Iteration on nonuniform multidimensional arrays
考虑以下C++代码示例:
int array_1[] = {5,6,7};
int array_2[] = {6,7,8,9};
int array_3[] = {2,3};
int* meta_array[] = {array_1, array_2, array3};
现在,我想迭代meta_array
的子数组中的所有元素,而不会导致seg错误。
当然,问题是我没有办法得到数组的大小来避免超出它们的界限。
我可以用sizeof array_1 / sizeof array_1[0]
很快得到一个普通一维数组的大小,但一旦我在meta_array
中,每个元素都被转换为一个指针,因此sizeof
将返回指针的字节大小,而不是整个数组。因此,sizeof meta_array[0] / sizeof meta_array[0][0]
对我的事业并没有多大帮助。
是否已经有了在非均匀多维数组上迭代的标准解决方案,或者我应该继续使用std::vector?
使用std::vector
。
或者,使用一个"闭合"数字,但必须确保永远不会有具有该值的元素。
int array_1[] = {5,6,7,-1};
int array_2[] = {6,7,8,9,-1};
int array_3[] = {2,3,-1};
int* meta_array[] =
{
array_1,
array_2,
array_3,
NULL
};
for(int i=0; meta_array[i] != NULL; ++i)
{
for(int j=0; meta_array[i][j] != -1; ++j)
printf("%d", meta_array[i][j]);
printf("n");
}
您将从Boost.MultiArray 中获得极大的好处
如果您坚决反对使用vector,您也可以在数组中保持长度:
#include <iostream>
#define ARRSIZE(X) sizeof(X) / sizeof(X[0])
int main() {
int array_1[] = { 5,6,7 };
int array_2[] = { 6,7,8,9 };
int array_3[] = { 2,3 };
int* meta_array[] = { array_1, array_2, array_3 };
int meta_array_lengths[] = { ARRSIZE(array_1), ARRSIZE(array_2), ARRSIZE(array_3) };
for (int outer = 0; outer < ARRSIZE(meta_array); outer++) {
for (int inner = 0; inner < meta_array_lengths[outer]; inner++) {
std::cout << meta_array[outer][inner] << " ";
}
std::cout << 'n';
}
return 0;
}
输出:
5 6 7
6 7 8 9
2 3
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- TSP递归解的迭代形式
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器