C++如何默认输出一个数组?

Posted

技术标签:

【中文标题】C++如何默认输出一个数组?【英文标题】:How does C++ output an array by default? 【发布时间】:2017-03-08 12:06:36 【问题描述】:

我的工作让我使用基于 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++ 中是如何工作的?

【问题讨论】:

我们需要更多。 c++中数组是如何声明的? 我想更好地回答这个问题。该字段的标题为 volScalarField。我知道它是三维的。定义大小的变量也是 x、y、z,它们具有相同的顺序。 volScalarField 是一个 C++ 类。这里有一些关于它的东西:openfoamcfd.sourceforge.net/doc/Doxygen/html/dc/d89/… 但我现在不明白。 @DevSolar 我为语气道歉,但我真正想知道的是,数组的默认输出在 C++ 中是怎样的。我不知道没有默认输出,所以现在我知道了,感谢 Quentin。我很生气,因为其他答案/cmets 似乎没有阅读完整的问题。 我不必编写 C++ 代码。我只是使用一个用 C++ (OpenFOAM) 编写的程序,它可以在文本文件中输出数组。我使用这个输出来计算 Fortran 中的东西。因为我知道如何编写 Fortran,所以我并没有真正看到那里的问题。 @KamaKashkanov:啊,我想我们现在正处于整个事情的关键。您不想知道“默认情况下 C++ 如何输出数组”。您想知道这个特定的 OpenFOAM 程序如何输出其数据,这样您就可以使用您的 Fortran 代码正确解释它! (您首先不知道该程序是否使用任何“默认”方式或自定义输出代码......)此时,您需要查看(或链接到......)程序的文档(如果有的话)或其来源......(我怀疑你可以把它变成一个不会因为离题而关闭的 SO 问题......) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

使用 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;

【讨论】:

以上是关于C++如何默认输出一个数组?的主要内容,如果未能解决你的问题,请参考以下文章

默认类构造函数 C++ 遇到问题

C++中cout<<字符数组名;为啥能输出字符串?

c++ 默认赋值运算符

C++ 更优雅的方式在多维数组中设置默认值

我需要 C++ 数组类模板,它是固定大小、基于堆栈且不需要默认构造函数

在 C++ 中的数组中未默认初始化的索引范围