相关疑难解决方法(0)

std :: deque比std :: vector更快插入到最后?

我开始比较:

  • 插入列表的前面
  • 插入向量的背面
  • 插入一个双端队列的前面

但后来我注意到即使在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)

c++ stl

9
推荐指数
1
解决办法
1220
查看次数

保持std :: list迭代器通过插入有效

注意:这不是我应该"使用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()都会使所有迭代器失效.这没有用.可能使用计数器比迭代器更好地跟踪双端队列中的位置?)

c++ iterator stdlist

6
推荐指数
2
解决办法
6057
查看次数

向量插入同一对象

我试图将一个向量中的几个值插入到相同的向量对象中,但似乎出错了:

#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()+23至元件vec.end()-46被插入到载体中。但是输出是:

3 1 2 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

编译器是g++ 4.1.2。我在哪里错了?

c++ iterator vector

4
推荐指数
1
解决办法
112
查看次数

标签 统计

c++ ×3

iterator ×2

stdlist ×1

stl ×1

vector ×1