我阅读了this很好的实验,特别是在insert()
和vector
容器上调用deque
的效果。该特定实验(实验4)的结果是deque
在此操作中非常优越。
我使用我编写的一个简短的排序函数实现了我自己的测试,我应该注意使用[]
运算符和其他成员函数,并发现了截然不同的结果。例如,要插入100,000个元素,vector
需要24.88秒,而deque
需要374.35秒。
我该如何解释?我想它与我的排序功能有关,但是想了解细节!
我正在使用g ++ 4.6而没有优化。
以下是该计划:
#include <iostream>
#include <vector>
#include <deque>
#include <cstdlib>
#include <ctime>
using namespace std;
size_t InsertionIndex(vector<double>& vec, double toInsert) {
for (size_t i = 0; i < vec.size(); ++i)
if (toInsert < vec[i])
return i;
return vec.size(); // return last index+1 if toInsert is largest yet
}
size_t InsertionIndex(deque<double>& deq, double toInsert) {
for (size_t i = 0; i < deq.size(); ++i)
if (toInsert < deq[i])
return i;
return deq.size(); // return last index+1 if toInsert is largest yet
}
int main() {
vector<double> vec;
deque<double> deq;
size_t N = 100000;
clock_t tic = clock();
for(int i = 0; i < N; ++i) {
double val = rand();
vec.insert(vec.begin() + InsertionIndex(vec, val), val);
// deq.insert(deq.begin() + InsertionIndex(deq, val), val);
}
float total = (float)(clock() - tic) / CLOCKS_PER_SEC;
cout << total << endl;
}
答案 0 :(得分:0)
deque
比vector
快得多的特殊情况是当您在容器的前面处插入时。在您的情况下,您将在随机位置插入,这实际上会为vector
提供优势。
此外,除非您使用优化版本,否则很可能在库实现中存在边界检查。这些检查可以显着增加时间。要进行正确的基准比较,必须在打开所有正常优化并关闭调试的情况下运行。
答案 1 :(得分:0)
您的代码正在执行插入排序,即O(n ^ 2)。迭代deque
比迭代vector
慢。
我怀疑你没有看到与发布链接相同的结果的原因是因为你的程序的运行时间由InsertionIndex
中的循环支配而不是deque::insert
的调用(或{ {1}}。