Предположим, у меня есть массив A[n][m]
и я хочу читать или писать в строку / столбец A
,
Если я хочу получить доступ к третьей строке матрицы, как я могу ссылаться на нее, как
A[3][:]
Возможно ли это в C ++ без использования цикла?
Нет, в 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);
}
Вы можете взять только последнее измерение
int A[3][5];
int * x = A[2];
int y = x[3];
Получить A[?][3]
— вам понадобится петля
2D-массив — это просто массив массивов.
Так int A[10][20]
объявляет массив размером 10, каждый из элементов которого является массивом размера 20, каждый из элементов которого является int
,
Выражение A[3]
имеет тип «массив из 20 дюймов», и вы можете использовать его как таковой. Это распадется в 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
по указателю р.
Редактировать :
опечатка, это должно быть:
int* p = &(A[3][0]) ;
Не с обычными массивами. std::valarray
опоры std::slice
, который допускает доступ к строке (шаг = 1) и доступ к столбцу (шаг = ширина строки)