Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矢量与Deque插入时间_C++_Vector_Stl_Containers_Deque - Fatal编程技术网

C++ 矢量与Deque插入时间

C++ 矢量与Deque插入时间,c++,vector,stl,containers,deque,C++,Vector,Stl,Containers,Deque,我读了一篇很好的实验,特别是比较了在vector和deque容器上调用insert()的性能。该特定实验(实验4)的结果是,deque在该操作中具有显著优势 我使用自己编写的一个简短的排序函数实现了自己的测试,应该注意的是,它使用了[]操作符和其他成员函数,并发现了截然不同的结果。例如,对于插入100000个元素,vector需要24.88秒,而deque需要374.35秒 我怎么解释呢?我想这与我的排序功能有关,但我想知道细节 我使用的是没有优化的g++4.6 节目如下: #include &

我读了一篇很好的实验,特别是比较了在
vector
deque
容器上调用
insert()
的性能。该特定实验(实验4)的结果是,
deque
在该操作中具有显著优势

我使用自己编写的一个简短的排序函数实现了自己的测试,应该注意的是,它使用了
[]
操作符和其他成员函数,并发现了截然不同的结果。例如,对于插入100000个元素,
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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
大小插入索引(向量和向量,双输入){
对于(大小i=0;icout特殊情况下,
deque
vector
快得多是在容器前面插入。在这种情况下,您在随机位置插入,这实际上会使
vector
具有优势


另外,除非您使用的是优化的构建,否则很可能在库实现中存在边界检查。这些检查会显著增加时间。要进行正确的基准比较,您必须在打开所有正常优化并关闭调试的情况下运行。

您的代码正在执行插入排序,这是O(n^2).在
deque
上迭代比在
向量上迭代要慢


我怀疑您没有看到与发布的链接相同的结果的原因是,您的程序的运行时主要由
InsertionIndex
中的循环控制,而不是调用
deque::insert
(或
vector::insert

告诉我们:1)您使用的编译器和2)不管你是否在测试一个优化的构建。只是补充说我使用的是没有优化的g++版本,但我不确定如何找出我使用的是哪个g++版本。很酷,谢谢。双精度向量可能会更快,但是如果类类型大,deque肯定会使用fasterOk,谢谢。我的编译器命令是
g++filename.cpp
。我是否需要添加任何东西来关闭调试,以及我应该使用哪种优化?例如,-o2?@bcf:对于gcc,默认实现不使用选中迭代器,因此只需将优化器升级(-o2或-O3)应该足够了。但是比较中的重要部分是Mark在第一段中提到的内容。deque的优点是在前面插入和删除(您链接的文章中顺便提到了这一点)