结构体向量与结构体向量的映射

Map of vector of struct vs Vector of struct

本文关键字:结构体 向量 映射      更新时间:2023-10-16

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

如果我要使用map(以author字符串作为键),下面是结构:

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

如果我用向量来代替,这就是它的结构:

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

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

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

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

vector不会为你做任何自动排序,所以你可能push_back引号当你阅读它们,然后做一个std::sort一旦数据的加载,之后你可以找到元素很快就通过作者std::binary_searchstd::lower_bound,或确定插入位置使用例如std::lower_bound新的报价,但是如果你想插入一个新报价之后你必须把现有的矢量元素从那个位置的方法,使房间——这是相对较慢。由于您只是根据用户输入进行一些特别的插入,因此在向量中只使用几百个引号进行插入所花费的时间是完全不重要的。但是,为了学习编程,最好理解multimap被安排为一种分支二叉树,用指针链接数据元素,这允许相对快速的插入(和删除)。对于一些应用程序来说,跟随所有这些指针可能比vector的连续内存(与CPU缓存内存一起工作更好)更昂贵(即更慢),但在你的情况下,数据元素都是字符串和字符串的向量,这可能(除非短字符串优化启动)需要跳过所有的内存。

一般来说,如果author自然是数据的键,只需使用multi_map…它将在合理的时间内完成所有操作,可能不是最快的,但绝不会特别慢,不像vector在数据填充后的容器中插入(/删除)。

取决于使用目的。两种数据结构各有优缺点。

向量

  • 位置索引在()或操作符[]
  • 查找功能不存在,您必须使用查找算法功能。

地图:

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

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

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

黄金法则是:"当有疑问时,测量。"
也就是说,写一些测试,做一些基准测试。

无论如何,考虑到你有大约200个项目,我认为在现代PC硬件上,这两个机箱应该没有什么大的区别。N较大时(例如10,0000s, 100,000 0s, 1,0000000s等) big - o 符号很重要。

vector往往比map更简单,我将使用它作为默认的容器选择(除非您的主要目标是访问给定作者姓名作为键的项目,在这种情况下,map似乎在逻辑上更合适)。

另一个选项可能是有一个vector,其中的项目使用作者的名字排序,因此您可以在vector中使用二进制搜索(即O(logN))。