用文本文件C++更快地初始化数组
Faster way to initialize array with text file C++
所以我有一个相当大的文本文件,其中有两列数字,我希望能够在我正在编写的程序中使用它作为二维数组。这是每次启动程序时都需要访问的数据,我觉得每次启动程序都必须用文件读取器读取数据太慢/效率太低。
因此,我想知道是否有一种更简单/更有效的方式来访问数据,而不必以传统方式读取数据(ifstream等)?我相信我曾经见过这样的事情:
float array[]{
#include "myfile.txt"
}
但我甚至不确定这样做是否有效,而且我找不到任何相关信息。
首先,您必须考虑如何声明和初始化二维数组。仅仅
int x[5][2] = {
{1, 1},
{2, 2},
{3, 3},
{4, 4},
{5, 5}
};
如果数组元素来自文件,则必须像创建文件一样创建;在CCD_ 1中;
{1, 1},
{2, 2},
{3, 3},
{4, 4},
{5, 5}
遵循C++include文件预处理器指令的规则,您可以简单地编写这样的代码;Source.cpp
文件;
#include <iostream>
using namespace std;
int x[5][2] = {
#include "file.txt"
};
int main(int argc, char* argv[])
{
for(int i = 0; i < 5; ++i)
{
for(int j = 0; j < 2; j++)
{
cout << "x[" << i + 1 << "][" << j + 1 << "] = " << x[i][j] << " , ";
}
cout << endl;
}
return 0;
}
如果你坚持在包含的文件中嵌入数据的方式,你可以使用Macros:
- 将数据写入包含的文件中(示例中为"myfile.txt"或"myfile.h")
-
以以下格式写入数据:
#define DATA 1,2,3,4,5
(您可以将其分成几行,但保持逗号分隔的格式)。
-
在源文件的顶部包含"myfile.h"。
-
使用DATA而不是#include语句:
float array[] { DATA };
要实现这一点,您应该按照C++语法格式化文本文件。您可以遵循许多教程,以便看到这方面的好例子以及正在发生的事情的描述。
下面是一个简短的例子:
- 对于一维数组,只需键入带有逗号的数字,如下所示
1.0, 3.4, 3.14, 5.56
- 对于两个或两个以上的维度,将每一行括在大括号
{}
中,用彗形分隔每一列,如下所示
{1.0, 3.14}, {4.1, 5.674}
以上是假设您正在遵循自己的示例
float array[] = {
#include "textFile.txt"
};
如果您不介意在数据更改时重新编译,那么您的做法是正确的。当然,数据必须有逗号,因为它必须是有效的C/C++语法。#include
所做的就是将文件的内容粘贴到源代码中。
OTOH,如果你介意在数据更改时重新编译,那么你需要在程序启动时动态分配内存并解析数据文件。这里你需要克服的问题是,你不一定事先知道数组有多大,如果你使用动态扩展的数组,随着数组的增长,你可能会在内存分配和删除方面浪费相当多的时间。和往常一样,我的解决方案是违反直觉的。我只读取了两次文件,一次是计算其中有多少数字,然后分配内存,然后再次读取文件,将数字解析到内存中。(如果读一次不需要很长时间,那么读两次也不需要,尤其是因为它已经在系统缓存中了。)
你说数据是二维的,但你可以把它作为一维放在数组中,然后只在二维访问它,就像这样:
#define A(row,col) array[(row)*2 + (col)]
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组