C++是否有类似于 Fortran 冒号 A[2][:] 的数组占位符?
Does C++ have an array placeholder similar to Fortran's colon A[2][:]?
假设我有一个数组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)和列访问(步长=行宽)
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- 我可以在 c++ 中使用占位符作为数组的索引吗?
- 为什么具有单独字符的字符数组不像字符串文字那样以 null 终止符结尾?
- 删除字符串数组中的换行符
- C++ 中 char 数组末尾的空终止符
- 有条件的断点修饰符以查看数组是否已更改
- C++是否有类似于 Fortran 冒号 A[2][:] 的数组占位符?
- 如何检查字符串数组是否在C++中具有换行符
- 将 char 数组作为参数传递时,为什么索引中不包含 null 终止符?
- 如何从字符数组中去除换行符
- C++字符数组null终止符位置
- 使用索引指示符初始化_C++_对象的数组
- 指向 C 和 C++ 中带有 const 限定符的数组的指针
- 如何在C++中将空格和换行符分隔的整数读取到2D数组中
- C++字符数组正确移动null终止符
- 将字符串逐字符添加到2dim数组中
- CSV 文件转换为带换行符的 2D 数组 CPP
- 在字符数组中插入新的换行符
- 定义一个不带终止符的c++字符数组
- 从文件中逐字符读取单词列表,并将其存储在数组中