C++是否有类似于 Fortran 冒号 A[2][:] 的数组占位符?

Does C++ have an array placeholder similar to Fortran's colon A[2][:]?

本文关键字:数组 占位符 是否 Fortran 类似于 冒号 C++      更新时间:2023-10-16

假设我有一个数组A[n][m],并且我想读取或写入A的行/列。

如果我想访问矩阵的第三行,我如何像一样引用它

A[3][:] 

在不使用循环的情况下,这在C++中可能吗?

不,C++没有类似于Fortran中[:]的运算符。然而,根据您是按行主还是列主的顺序存储内容,可以用类似的方式进行存储。

首先,数组在C++中并不是真正的第一类公民。使用std::array(对于较小的M, N,因为它们是堆栈分配的)或std::vector要容易得多。

假设我们使用的是std::vector:

template <typename T>
using matrix<T> = std::vector<std::vector<T>>;
matrix<int> m = {{1,2,3}, {4,5,6}, {7,8,9}};

要从中得到一行,我们可以简单地使用operator[]:

auto& row = m[0];  // Returns a std::vector<int>& containing {1, 2, 3}

当列按行主顺序排列时,获取列会更加困难。如果您需要更复杂的操作,使用矩阵库(如Eigen)可能是更好的方法。

编辑:如果你想用零填充整行,可以很容易地在结果上使用std::fill

//m defined as before
std::fill(std::begin(m[0]), std::end(m[0]), 0);

请注意,这在行的大小上仍然(显然)是线性的。这也可以很容易地封装在一个函数中:

template <typename T>
void clear_row(matrix<T>& m, std::size_t row, const T& new_value)
{
std::fill(std::begin(m[row]), std::end(m[row]), new_value);
}

如果你想用一组不同的值替换一行中的所有值,你可以使用迭代器:

template <typename T, typename Iterator>
void modify_row(matrix<T>& m, std::size_t row, Iterator new_start)
{
std::copy(std::begin(m[row]), std::end(m[row]), new_start);
}   

您只能获取最后一个维度

int A[3][5];
int * x = A[2];
int y = x[3];

要获得A[?][3]-您需要一个循环

2D数组只是数组的一个数组。

因此,int A[10][20]声明大小为10的数组,其每个元素都是大小为20的数组,其中每个元素都为int

表达式A[3]的类型为"array of 20int",您可以这样使用它。它将衰减为指向行的第一个元素的int *(假设您将它们视为行)。

列没有等效的表达式;你需要一个循环。

如果定义int A[5][10],则A将具有5*10*sizeof(int)的连续空间,在这种情况下,A[3][:]将在此数组中的第31个位置到第40个位置!!

int* p = &(A[30]) ;

*(p+0)到*(p+9)将是A[3][0]到A[3][9],您可以直接访问A的每个元素通过指针p。

编辑:

打字错误,应该是:

int* p = &(A[3][0]) ;

不使用常规数组。std::valarray支持std::slice,它允许行访问(步长=1)和列访问(步长=行宽)