我正在制作一个小型项目程序,该程序涉及输入稍后将保存到数据库中的引号(在本例中为.txt文件)。还有用户输入的命令,例如列表(显示作者的引用)和随机(显示随机引用)。
如果我使用地图(以作者字符串作为关键字),这是结构:
struct Information{
string quoteContent;
vector<string> tags;
}
如果我改用矢量,那么这就是结构:
struct Information{
string author;
string quoteContent;
vector<string> tags;
}
注意:我在数据库中拥有的最大引号数为200.(从文件导入)
我只是想知道哪种数据结构会产生更好的性能。我对这个c ++的东西还很陌生,所以任何帮助都会受到赞赏!
答案 0 :(得分:1)
对于您的数据卷,从性能角度来看显然无关紧要,但multi_map
可能会让您编写更短,更易于理解和可维护的代码。关于向量与地图的一般性能(很容易了解,但可能只与数百万数据元素或低延迟要求相关)......
vector
不会对您进行任何自动排序,因此您在阅读时可能会push_back
引用,然后在加载数据后再执行一次std::sort
,之后您可以通过std::binary_search
或std::lower_bound
的作者非常快速地找到元素,或使用例如标识新引号的插入位置std::lower_bound
,但是如果你想在此后插入一个新的引号,你必须从那个位置移开现有的向量元素,以便腾出空间 - 这相对较慢。由于您只是根据用户输入进行了一些临时插入,因此在向量中仅使用几百个引号执行此操作的时间将是完全无关紧要的。为了学习编程,最好理解一个multimap
被安排为一种分支二叉树,其中指针链接数据元素,允许相对快速的插入(和删除)。对于某些应用程序,跟随所有这些指针可能比向量的连续内存(它更好地与CPU高速缓存存储器一样)更昂贵(即更慢),但在您的情况下,数据元素是所有可能的字符串和字符串向量(除非短字符串优化启动)无论如何都需要跳过内存。
一般情况下,如果作者自然是数据的关键,只需使用multi_map
...它会在合理的时间内完成所有操作,也许不是最快但从不特别慢,不像后期的矢量-data-population中间容器插入(/删除)。
答案 1 :(得分:0)
取决于使用目的。这两种数据结构各有利弊。
载体
图:
(使用无序地图以获得比地图更好的性能。)
根据您想要实现的目标使用数据结构。
答案 2 :(得分:0)
黄金法则是:“如果有疑问,请测量。”
即写一些测试,做一些基准测试。
无论如何,考虑到你有大约200件物品,我认为现代PC硬件上的两个案例不应该有重大区别。当 N 很大(例如10,000s,100,000s,1,000,000s等)时, Big-O 符号很重要
vector
往往比map
更简单,我会将其用作默认的容器选择(除非您的主要目标是访问以作者姓名作为关键字的项目,这种情况map
似乎更合乎逻辑。
另一种选择可能是使用作者姓名对项目进行vector
排序,因此您可以在vector
内使用二进制搜索( O(logN))