Как 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::arrays) содержимое в один вызов в 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;
}
Другие вопросы по тегам