草庐IT

c++ - 使用指向元素的指针进行多维数组索引

据我所知,栈上的多维数组会按行顺序占用连续的内存。根据ISOC++标准使用指向元素的指针来索引多维数组是未定义的行为吗?例如:#include#includeintmain(){inta[5][4]{{1,2,3,4},{},{5,6,7,8}};constexprautosz=sizeof(a)/sizeof(std::remove_all_extents::type);int*p=&a[0][0];inti=p[11];//如果指针没有超出数组a的边界,上述代码将正确编译并运行。但这是因为编译器定义的行为或语言标准而发生的吗?任何来自ISOC++标准的引用都是最好的。

c++ - 高性能 C++ 多维数组

我正在寻找有关C++的高性能多维数组库/类的建议。我真正需要的是:能够动态分配具有在运行时确定的大小的数组访问和修改单个数组值的能力(快速)能够使用简单的数组算术如array1=array2+2*array3一个维护良好的库我遇到过各种库,包括:Blitz++,看起来正是我需要的,但似乎维护得不是很好(最新的稳定版本是5年前)Boost,它不支持数组算术,并且与Blitz++相比似乎相当慢。乔恩·鲍曼的array.h没有文档。还有人对上述选项有任何其他建议或意见吗? 最佳答案 Eigen维护得非常好(至少现在每个月都会推出新版本)并

c++ - 如何在 C++11 中初始化(通过初始化列表)多维 std::array?

我正在尝试通过初始化程序列表初始化2Dstd::array,但是编译器告诉我初始化程序太多。例如:std::array,2>shape={{1,1},{1,1}};编译器错误:错误:‘std::array,2ul>’的初始化程序太多但显然没有太多。我做错了吗? 最佳答案 尝试再添加一对{}以确保我们正在初始化内部C数组。std::array,2>shape={{{1,1},{1,1}}};或者直接去掉所有的括号。std::array,2>shape={1,1,1,1}; 关于c++-如何

c++ - 为什么 c/c++ 允许在函数调用中省略多维数组的最左边索引?

我只是想知道为什么在将数组传递给函数时允许省略多维数组的最左边的索引?为什么不超过一个索引?以及编译器如何找出省略一个索引的大小? 最佳答案 其他答案描述了C标准如何处理数组到指针的转换以及这如何影响函数声明,但我觉得他们没有进入为什么,所以我开始...在C中,数组代表内存中紧密排列的元素。A->______...i:012345...在上面的例子中,每个数组元素都是1_宽。为了找到第i个元素,我们必须去第i个地址。(注意最左边的维度(大小)在这里无关紧要)现在考虑一个多维数组:B->[___][___][___][___]...i

c++ - 声明多维 std::array 的简洁方式

小问题:有没有更短的方法来做到这一点array,n>,m>matrix;我希望有类似的东西array,n,m>matrix;但它不起作用...... 最佳答案 模板别名可能会有所帮助:#includetemplateusingMatrix=std::array,I>;intmain(){Matrixmatrix;} 关于c++-声明多维std::array的简洁方式,我们在StackOverflow上找到一个类似的问题: https://stackoverfl

c++ - 在 C/C++ 中使用多维数组是不好的做法吗?

一些程序员似乎非常讨厌他们,而另一些人似乎认为他们很好。我知道可以对多维数组执行的任何操作也可以对常规数组执行,因此它们在功能上是等效的。使用多维数组是不好的做法,还是没关系? 最佳答案 您是否需要将多维数据存储在您提前知道维度的位置?如果是这样,请使用多维数组。如果您不提前知道维度(即,您将不得不动态分配数组),那么您要么需要分配一个一维数组并使用索引算法模拟一个n维数组,或者分配一个指向元素数组的指针数组以获得实际的多维数组语义这取决于具体的用例,但根据经验,我几乎总是更喜欢前者,因为它减少了内存管理的麻烦和堆分配。两种方法的复

c++ - 为什么交换多维数组不是noexcept?

我有以下片段:#include#includeintmain(intargc,char**argv){intx[2][3];inty[2][3];usingstd::swap;std::cout使用GCC4.9.0,这将打印0。我不明白为什么。根据标准,std::swap有两个重载:namespacestd{templatevoidswap(T&a,T&b)noexcept(is_nothrow_move_constructible::value&&is_nothrow_move_assignable::value);templatevoidswap(T(&a)[N],T(&b)[N]

c++ - C/C++ 如何在没有嵌套循环的情况下复制多维字符数组?

我正在寻找一种将多维字符数组复制到新目的地的智能方法。我想复制char数组,因为我想在不更改源数组的情况下编辑内容。我可以构建嵌套循环来手动复制每个字符,但我希望有更好的方法。更新:我没有2.级别维度的大小。给定的只是长度(行)。代码如下所示:char**tmp;char**realDest;intlength=someFunctionThatFillsTmp(&tmp);//nowIwanttocopytmptorealDest我正在寻找一种方法,将tmp的所有内存复制到空闲内存中,并将realDest指向它。更新2:someFunctionThatFillsTmp()是RedisC

c++ - 从函数返回多维数组

如何返回存储在类的private字段中的多维数组?classMyclass{private:intmyarray[5][5];public:int**get_array();};//Thisdoesnotwork:int**Myclass::get_array(){returnmyarray;}我收到以下错误:cannotconvertint(*)[5][5]toint**inreturn 最佳答案 二维数组不会衰减为指向整数的指针。它衰减为指向整数数组的指针-也就是说,只有第一个维度衰减为指针。指针不指向int指针,它在递增时会增

堆上的 C++ 多维数组

如何动态分配多维数组? 最佳答案 如果您已经知道嵌套维度的大小,您也可以使用new按字面意思分配多维数组:typedefintdimensions[3][4];dimensions*dim=newdimensions[10];dim[/*from0to9*/][/*from0to2*/][/*from0to3*/]=42;delete[]dim;而不是10,可以传递运行时确定的值。因为它不是类型运算符new返回的一部分,所以这是允许的。例如,如果您知道列数,但又想保持行数可变,这很好。typedef让代码更容易阅读。