Есть ли в C ++ заполнитель массива, похожий на двоеточие Фортрана A [2] [:]?

Предположим, у меня есть массив A[n][m]и я хочу читать или писать в строку / столбец A,

Если я хочу получить доступ к третьей строке матрицы, как я могу ссылаться на нее, как

A[3][:]

Возможно ли это в C ++ без использования цикла?

2

Решение

Нет, в C ++ нет операторов, похожих на [:] в Фортране. В зависимости от того, сохраняете ли вы вещи в мажорной или колоночной последовательности, это может быть сделано аналогичным образом.

Во-первых, массивы не являются первоклассными гражданами в 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}

Получить столбцы, когда они расположены в главном порядке, сложнее. Если вам требуется более сложный вид операций, используйте матричную библиотеку (например, собственный) может быть лучший способ пойти.

Редактировать: если вы хотите заполнить всю строку нулями, это можно легко сделать с помощью 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);
}
1

Другие решения

Вы можете взять только последнее измерение

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

Получить A[?][3] — вам понадобится петля

0

2D-массив — это просто массив массивов.

Так int A[10][20] объявляет массив размером 10, каждый из элементов которого является массивом размера 20, каждый из элементов которого является int,

Выражение A[3] имеет тип «массив из 20 дюймов», и вы можете использовать его как таковой. Это распадется в int * указывая на первый элемент строки (при условии, что вы думаете о них как о строках).

Не существует эквивалентного выражения для столбцов; вам понадобится петля для этого.

0

если вы определите 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
по указателю р.

Редактировать :

опечатка, это должно быть:

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

Не с обычными массивами. std::valarray опоры std::slice, который допускает доступ к строке (шаг = 1) и доступ к столбцу (шаг = ширина строки)

0