Как C++ выводит массив по умолчанию?
Моя работа заставила меня работать с OpenFOAM (симуляция жидкости), которая основана на C++. Я ничего не знаю о C++, даже о том, как скомпилировать программу hello world. В OpenFOAM вы можете вывести трехмерный массив в виде ascii в текстовом файле. Это нормально, потому что мой расчет не займет много времени. В файле он имеет одно значение на строку. Какой порядок имеют эти значения?
Итак, в Фортране я могу сделать
WRITE(*,*) 3d_array
и он будет отображать значения массива в том порядке, в котором они были сохранены, это означает, что первая итерация идет в направлении x, затем в y, а затем в направлении z. Вывод в том же порядке, как если бы я вывел его таким образом:
integer, allocatable, dimension(x,y,z)::3d_array
[...]
do k=1,z
do j=1,y
do i=1,x
write(*,*) 3d_array(i,j,k)
end do
end do
end do
Как это работает в C++?
3 ответа
Нет стандартной функциональности для вывода массива (или std::vector
или std::array
s) содержимое в один вызов в C++. Вы должны написать тройной цикл самостоятельно.
Следовательно, просто запишите его в том порядке, в котором вы хотите, и используйте тот же порядок, если вы хотите прочитать его обратно.
В C++ нет способа по умолчанию для вывода массива. Вы можете только выводить элемент массива за элементом, перебирая его.
Однако то, о чем вы говорите, совершенно не связано с самим выводом. То, о чем вы говорите, это упорядочение индекса многомерного массива при отображении в линейный массив (например, x-быстрая или y-самая быстрая).
Говоря о динамически размещаемых массивах, C++ не из коробки поддерживает многомерное распределение, поэтому не существует способа "по умолчанию" для упорядочения индекса. Когда вы хотите использовать многомерный массив в C++, вы сами должны придумать способ сопоставить свои индексы с одномерным массивом. При выводе массива вы просто перебираете отдельные элементы один за другим и распечатываете их. Результирующий порядок будет тем порядком, который вы выбрали для отображения индекса.
Конечно, вы также можете распечатать их в другом порядке, нежели тот, который у них есть в памяти. Но по умолчанию нет.
Пример использования std::vector:
#include <iostream>
#include <vector>
int main() {
std::vector< std::vector< std::vector<int> > >vec3d{ {{0, 1, 2}, {1, 2, 3}}, {{5, 6}} };
for (auto i : vec3d) {
std::cout << "[";
for (auto j : i) {
std::cout << "[";
for (auto k : j) {
std::cout << k << " ";
}
std::cout << "]";
}
std::cout << "]";
}
return 0;
}