【问题标题】:String vs vector to store large texts存储大文本的字符串与向量
【发布时间】:2017-02-20 13:15:44
【问题描述】:

对于数据压缩,我需要打开文件(此处为文本文件)并将其所有内容存储在变量中。

使用字符串或字符向量来存储非常大的文本(数百万或更多字符)更好吗?

更好,我的意思是更快地遍历每个字符,也更快地使用count 函数来计算文本中给定字符的出现次数。

大小在这里并不是真正的问题,因为字符串和向量都可以存储大量字符,如果需要,我可以将文本分成几个子文本。

【问题讨论】:

  • 实际性能取决于特定的 C++ 实现。在这方面,字符串和向量之间没有实质性区别。两者都是随机访问容器,提供类似的功能。您将花费更多时间试图弄清楚这一点,然后您可能希望通过选择据称最优化的容器来节省。
  • 在实践中,很可能根本没有区别。两种类型都提供前向迭代器,它们(通常)实现为指针。唯一的语义差异是,您的代码的读者更有可能期望在vector 的受控序列中嵌入NUL 字符。由于您正在处理文本文件,所以这不是问题。
  • 你的瓶颈不是内存中的容器,而是文件I/O。您将需要使用一个容器,您可以在构建过程中 调整大小 或设置容量。在读取文件时重新分配内存非常慢。

标签: c++ text storage


【解决方案1】:

由于向量和字符串的性能取决于实现,因此没有明确的答案。我建议您在您的环境中对这些操作进行基准测试并进行选择。

this 是一个非常不错的讲座,内容涉及对代码进行基准测试,以及即使是标准也不能总是建议正确的工具。

谈话的重点是性能可能会发生巨大且不可预测的变化 - 在一个示例中,在循环内移动的实例通过启动编译器优化实际上将运行时间缩短了 80%。

如果您真的关心性能,请始终衡量自己。

【讨论】:

    【解决方案2】:

    使用字符串或字符向量来存储非常大的文本(数百万或更多字符)更好吗?

    (此处为文本文件)

    std::string 适用于文本数据。主要是由于约定,也因为它提供了一些基本的字符串处理工具,std::vector 没有。

    “更好”是指循环遍历每个字符的速度更快,使用 count 函数计算文本中给定字符出现的次数也更快。

    通过这些指标,字符串和向量都具有可比性并且实际上是相同的,尽管确切的性能是特定于实现的。

    【讨论】:

      猜你喜欢
      • 2018-07-18
      • 1970-01-01
      • 2015-07-20
      • 2015-09-22
      • 2021-03-17
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2016-04-23
      相关资源
      最近更新 更多