【问题标题】:Map of vector of struct vs Vector of struct结构向量与结构向量的映射
【发布时间】:2014-03-26 08:10:36
【问题描述】:

我正在制作一个小型项目程序,其中涉及输入稍后将保存到数据库中的引号(在本例中为 .txt 文件)。用户还可以输入一些命令,例如 list(显示作者的引用)和 random(显示随机引用)。

如果我要使用地图(以作者字符串作为键),这是结构:

 struct Information{
    string quoteContent;
    vector<string> tags;
 }

如果我改用向量的话,结构如下:

 struct Information{
    string author;
    string quoteContent;
    vector<string> tags;
 }

注意:我在数据库中拥有的最大引用数是 200。(从文件导入)

我只是想知道哪种数据结构会产生更好的性能。我对这个 c++ 东西还是很陌生,所以任何帮助都将不胜感激!

【问题讨论】:

  • 会一次性读取所有数据吗?我的意思是,例如,仅在应用程序的开头?或者在执行过程中可能会添加数据?
  • @KirilKirov 我已经在应用程序的开头格式化了要从文件中读取的数据,但是还有一个输入命令用户可以在执行时使用
  • @JoachimPileborg 哦,好主意!直到现在我才知道这件事。好吧,我猜你每天都能学到新东西:D

标签: c++ vector map struct


【解决方案1】:

对于您的数据量,从性能的角度来看,这显然无关紧要,但multi_map 可能会让您编写更短、更易于理解和可维护的代码。关于矢量与地图的一般性能(这很值得了解,但可能只与数百万个数据元素或低延迟要求相关)...

vector 不会为您进行任何自动排序,因此您可能会在阅读它们时使用 push_back 引号,然后在加载数据后执行 std::sort ,之后您可以通过以下方式快速找到元素使用std::binary_searchstd::lower_bound 创作,或使用例如标识新引号的插入位置std::lower_bound,但是如果你想在之后插入一个新的引号,你必须将现有的向量元素从那个位置移开以腾出空间——这相对较慢。由于您只是根据用户输入进行一些临时插入,因此在向量中仅使用几百个引号执行此操作的时间将完全是微不足道的。不过,出于学习编程的目的,最好了解multimap 被安排为一种分支二叉树,其指针链接数据元素,这允许相对快速的插入(和删除)。对于某些遵循所有这些指针的应用程序可能比向量的连续内存更昂贵(即更慢)(与 CPU 高速缓存一起工作更好),但在您的情况下,数据元素都是字符串和字符串的向量,可能(除非 Short字符串优化启动)无论如何都需要跳过内存。

一般来说,如果作者自然是您数据的关键,只需使用 multi_map... 它会在合理的时间内完成您的所有操作,可能不是最快的,但从不会特别慢,不像后数据的向量-population 中间容器插入 (/deletions)。

【讨论】:

  • 在所有答案中,我发现你的答案是最有用的(这消除了我的一些疑问)。干杯! :D
【解决方案2】:

取决于使用目的。两种数据结构各有利弊。

向量

  • 位置索引 at() 或运算符 []
  • 查找函数不存在 您必须使用查找算法函数。

地图:

  • 可以搜索密钥
  • 位置索引不适用。存储密钥

(使用无序映射以获得比映射更好的性能。)

根据您想要实现的目标使用数据结构。

【讨论】:

    【解决方案3】:

    黄金法则是:“如有疑问,请衡量。”
    即写一些测试,做一些基准测试。

    无论如何,考虑到您有大约 200 件物品,我认为这两种情况在现代 PC 硬件上应该没有重要区别。当 N 很大时,Big-O 符号很重要(例如 10,000s、100,000s、1,000,000s 等)

    vector 往往比map 更简单,我会将它用作选择的默认容器(除非您的主要目标是访问以作者姓名为键的项目,在本例中为 @987654323 @ 似乎更符合逻辑)。

    另一种选择可能是使用vector,其中项目使用作者姓名排序,因此您可以在vector 中使用二分搜索(O(logN))。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2017-06-11
      • 2020-06-30
      • 1970-01-01
      • 2012-10-16
      相关资源
      最近更新 更多