【发布时间】:2018-05-08 22:41:48
【问题描述】:
将整数推入向量,然后对整个向量进行排序比将整数插入集合更快或更慢,集合在输入时进行排序。抱歉,我是 C++ 新手,不知道如何使用时钟功能。有人可以帮忙吗?任何帮助将不胜感激。提前致谢。
#include <vector>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
vector<int> possibility1;
set<int> possibility2;
int main()
{
random_device rd;
mt19937 rng(rd());
uniform_int_distribution<int> uni(0,1000);
// possibility 1
for(int i = 0; i < 1000000; i++) {
int r = uni(rng);
possibility1.push_back(r);
}
// possibility 2
for(int j = 0; j < 1000000; j++) {
int r = uni(rng);
possibility2.insert(r);
}
}
编辑
对于这种情况,时间上的差异并不重要,但是如果我有带有很多私有变量的大型类,并且创建一个向量/对象集(也有一个比较函数),那么会更快吗?
【问题讨论】:
-
什么更快取决于您的特定要求。使用您将实际使用的真实数据编写您自己的基准测试,并进行自己的计时。
-
一般来说,对于复制/移动成本较低的类型(特别是,如果您使用
std::vector::reserve()),向量往往更快,但测量是唯一确定的方法。跨度> -
对象(或一个对象的大小)是什么并不重要。重要的是访问模式。您的应用程序是否处理所有内容然后只读取项目?它是否经常迭代所有这些?它会交替移除和插入吗?所有这些因素都考虑在内。你没有告诉我们任何一个。
-
在我的测试中,排序的 vector 往往比 set 快(可能是由于缓存的局部性)。您可以创建一个函数来插入正确排序的位置,而不是一直排序。但它显然比只使用一个集合更繁琐。
-
考虑这一点:
set通常实现为红黑树,除了数据之外,每个节点使用 3 个指针。在 64 位系统上,这意味着 100 万个ints 可能会使用 32 MB 作为集合和 4 MB 作为向量。这对你的处理器的缓存大小有什么影响?
标签: c++ performance sorting vector set