带有std :: begin(),std :: end()问题的C++ 11 auto迭代器类型

var*_*ard 7 c++ std c++11

我有一些私有类成员,表示std::deque包含一些数据的随机访问数组:

std::vector<std::deque<SomeDataClass> > someMember;
Run Code Online (Sandbox Code Playgroud)

我想提供一个公共类方法,它返回可迭代的数据结构,包含我的deques数组中的所有数据元素:

std::deque<SomeDataClass> someMethod();
Run Code Online (Sandbox Code Playgroud)

我希望这个方法遍历vector中的所有deques并复制它上面的每个元素到本地std :: deque,最终按值返回本地std :: deque.我想用C++ 11实现这个方法autostd::begin(),std::end():

std::deque<SomeDataClass> MyClassName::someMethod(){
    std::deque<DirectedEdge> allDataItems;
    std::deque<DirectedEdge>::iterator deqIter = allDataItems.begin();
    for(auto it = std::begin(someMember); it != std::end(someMember); ++it){
        std::copy(std::begin(*it), std::end(*it), deqIter);
    }

    return allDataItems;
}
Run Code Online (Sandbox Code Playgroud)

我在deque标头中的运行时收到数据访问冲突未处理的异常错误.什么是错误?

Rei*_*ica 13

std::copy()要求目标范围足够大以容纳副本,但是allDataItems为空.你必须allDataItems提前预留空间(但这是不可能的std::deque).您应该使用std::back_inserter(定义<iterator>)代替:

std::deque<SomeDataClass> MyClassName::someMethod(){
    std::deque<DirectedEdge> allDataItems;
    for(auto it = std::begin(someMember); it < std::end(someMember); ++it){
        std::copy(std::begin(*it), std::end(*it), std::back_inserter(allDataItems));
    }

    return allDataItems;
}
Run Code Online (Sandbox Code Playgroud)

  • 考虑做`allDataItems.insert(std :: end(allDataItems),...);`.我会说在可能的情况下使用成员通常会更好. (5认同)
  • @chris你可以把它作为一个单独的答案,所以OP可以决定他们更喜欢哪个. (3认同)