我开始比较:
但后来我注意到即使在push_back()deque上似乎也更快.我必须做一些错误的,我不能相信一个更一般的容器也不太可能超过一个特定的一个.
我使用谷歌基准测试的代码:
#include "benchmark/benchmark.h"
#include <deque>
#include <vector>
#define NUM_INS 1000
static void BM_InsertVector(benchmark::State& state) {
std::vector<int> v;
v.reserve(NUM_INS);
while (state.KeepRunning()) {
state.PauseTiming();
v.clear();
state.ResumeTiming();
for (size_t i = 0; i < NUM_INS; i++)
v.push_back(i);
}
}
BENCHMARK(BM_InsertVector);
static void BM_InsertDeque(benchmark::State& state) {
std::deque<int> v;
while (state.KeepRunning()) {
state.PauseTiming();
v.clear();
state.ResumeTiming();
for (size_t i = 0; i < NUM_INS; i++)
v.push_back(i);
}
}
BENCHMARK(BM_InsertDeque);
BENCHMARK_MAIN();
Run Code Online (Sandbox Code Playgroud)
结果:
Run on (1 X 2592 MHz …Run Code Online (Sandbox Code Playgroud) 注意:这不是我应该"使用list还是deque"的问题.这是一个关于迭代器在面对的有效性的问题insert().
这可能是一个简单的问题,我只是太密集了,看不到正确的方法来做到这一点.我正在实现(无论好坏)网络流量缓冲区作为a std::list<char> buf,并且我将当前的读取位置保持为迭代器readpos.
当我添加数据时,我会做类似的事情
buf.insert(buf.end(), newdata.begin(), newdata.end());
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,如何保持readpos迭代器有效?如果它指向旧的中间buf,那么它应该没问题(通过std :: list的迭代器保证),但通常我可能已经读取并处理了所有数据而且我有readpos == buf.end().在插入之后,我readpos 总是希望指向下一个未读的字符,在插入的情况下应该是第一个插入的字符.
有什么建议?(没有将缓冲区更改为a std::deque<char>,这似乎更适合任务,如下所示.)
更新:从使用GCC4.4的快速测试中我发现deque和list的行为方式不同readpos = buf.end():插入结束后,readpos在列表中被破坏,但指向deque中的下一个元素.这是标准保证吗?
(根据cplusplus,任何deque :: insert()都会使所有迭代器失效.这没有用.可能使用计数器比迭代器更好地跟踪双端队列中的位置?)
我试图将一个向量中的几个值插入到相同的向量对象中,但似乎出错了:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
for(int i=0;i<9;i++)
{
vec.push_back(i+1);
}
vec.insert(vec.begin(),vec.begin()+2,vec.end()-4); //PROBLEM
vector<int>::iterator ivec=vec.begin();
while(ivec!=vec.end())
{
cout<<*ivec<<' ';
++ivec;
}
cout<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待从元件vec.begin()+2即3至元件vec.end()-4即6被插入到载体中。但是输出是:
3 1 2 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)
编译器是g++ 4.1.2。我在哪里错了?