使用啥数据结构来快速存储文本文件,它有变量号。行数和变量号。在 C++ 中快速添加子元素?
Posted
技术标签:
【中文标题】使用啥数据结构来快速存储文本文件,它有变量号。行数和变量号。在 C++ 中快速添加子元素?【英文标题】:What data structure to use to store text file quickly, which has variable no. of lines and variable no. of sub elements quickly, in C++?使用什么数据结构来快速存储文本文件,它有变量号。行数和变量号。在 C++ 中快速添加子元素? 【发布时间】:2014-07-20 12:45:49 【问题描述】:首要任务是以毫秒为单位的性能(速度)。 用什么数据结构来快速存储文本文件? 鉴于文本文件可能有变量号。的行。 每行都有变量号。的坐标。而这些坐标中的每一个都需要经过计算。 另外,我想按顺序访问点,进行计算。如有必要,删除一些坐标。 将有足够的可用内存空间,比文件大小大一千倍。
x1,y1 x2,y2 ....
x6,y6 x7,y7 .....
......
准确来说,文件如下-
7866.777,505.821 -7866.773,508.291 -786.8402,500.845 -7864835.125147422,5084020.882938482
-7865228.42,508.491642 -7864114.999361482,5081606.040795522
-8865228.42,508.4642 -7864.999361,5081.040795522
现在如何快速存储每个元素? 我可以将它存储在矢量中吗?它很灵活,但速度很慢。 我可以将它存储在二维数组中吗?它是最快的吗?但它有可变数量的行和每行中不同数量的元素。另外,数组中的元素个数需要保持不变,有没有其他方法可以使用动态增长的数组呢?
更新 由于询问了详细信息,因此我正在更新问题的详细信息并尽可能准确。
【问题讨论】:
'我可以将它存储在向量中吗?它很灵活,但速度很慢。'你是如何衡量这个的? 你真正应该首先做的是分析和测量你的程序,看看实际的瓶颈在哪里。另外,您真的需要它更快吗?你有什么要求?你的用例是什么? 你在做什么?请阅读the XY problem。 在任何正常情况下,大部分时间都花在文本格式上,而不是存储数据上。如果您确实需要显着提高性能,请使用二进制序列化表示并跳过格式化。 @πάντα ῥεῖ - 在这种情况下,我们无法及时知道行数和子元素的数量。所以,我使用带有后推的向量。但是,我读到 pushback 比数组贵。 ***.com/questions/3664272/… '但是,我读到 pushback 很昂贵' 取决于初始/后续分配大小。此外,您不需要行号,如果文件中的所有整数数据都可以使用while(instream >> number) datavec.push_back(number);
恕我直言(有多种方法可以跳过 ','
字符)。
【参考方案1】:
“快速存储”没有意义。 在内存中存储数据的最快方法是纯字符串/向量。 如果您需要检索数据,也可以从纯字符串/向量中读取数据。 就地操作数据的最快方法可能是使用称为“绳索”的数据结构,但这不是 C++ 标准库的一部分,因此您必须在其他地方找到它。
不过,目前我觉得你并不清楚你真正想做什么,所以很难给出准确的答案。
【讨论】:
【参考方案2】:一种方法是将整个文件读入std::istringstream
,然后使用它代替文件。使用std::istringstream
意味着整个文件将在内存中,比磁盘快得多。
【讨论】:
你真的只是推荐使用 I/O 流来回答有关高性能数据结构的问题吗?! @Mehrdad 至少这是一种进入记忆的方式。我认为,主要问题是,OP 是否真的需要拥有来自最优化的低级内容的神秘、神秘和不可读(因此难以维护)的代码,这些代码需要剃须几毫秒? @JoachimPileborg 在上述情况下如何使用 istringstream 读取/存储值?您有任何示例或参考链接。以上是关于使用啥数据结构来快速存储文本文件,它有变量号。行数和变量号。在 C++ 中快速添加子元素?的主要内容,如果未能解决你的问题,请参考以下文章