-3

我的工作让我使用基于 C++ 的 OpenFOAM(流体模拟材料)。我对 C++ 一无所知,甚至不知道如何编译一个 hello world 程序。在 OpenFOAM 中,您可以在文本文件中将三维数组作为 ascii 输出。这没关系,因为我的计算不需要很长时间。然后在文件中每行有一个值。这些值有什么顺序?

所以,在 Fortran 我可以做

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++ 中是如何工作的?

4

3 回答 3

2

没有标准功能可以在 C++ 中的一次调用中输出数组(或std::vector's 或's)的内容。std::array您必须自己编写三重循环。

因此,只需按照您希望的顺序编写它,如果您想读回它,请使用相同的顺序。

于 2017-03-08T12:09:58.547 回答
1

C++ 中没有输出数组的默认方式。您只能通过迭代它来逐个元素地输出数组元素。

但是,您所说的与输出本身完全无关。您所说的是多维数组在映射到线性数组时的索引排序(例如,x-fastest 或 y-fastest)。

在谈到动态分配的数组时,C++ 并没有开箱即用地支持多维分配,因此索引排序没有“默认”方式。当您想在 C++ 中使用多维数组时,您必须自己想办法将索引映射到一维数组。输出数组时,您只需逐个迭代各个元素并打印它们。结果顺序将是您为索引映射选择的顺序。

当然,您也可以选择以与内存中实际存在的顺序不同的顺序打印它们。但是没有默认值。

于 2017-03-08T13:05:38.967 回答
0

使用 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;
}
于 2017-03-08T12:36:56.210 回答