gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:48 27 4
gpt4 key购买 nike

假设我有一个数组 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);
}

关于c++ - C++有没有类似于Fortran的冒号A[2][:]?的数组占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20961673/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com