带有 std::begin()、std::end() 问题的 C++11 自动迭代器类型

标签 c++ c++11 std

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

std::vector<std::deque<SomeDataClass> > someMember;

我想提供一个公共(public)类方法,它返回可迭代的数据结构,其中包含来 self 的双端队列数组的所有数据元素:

std::deque<SomeDataClass> someMethod();

我希望此方法遍历 vector 中的所有双端队列,并将其途中的每个元素复制到本地 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;
}

我在运行时在双端队列 header 中收到数据访问冲突未处理的异常错误。什么是错误?

最佳答案

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;
}

关于带有 std::begin()、std::end() 问题的 C++11 自动迭代器类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17670682/

相关文章:

c++ - 在 VS2005 上使用 "--layout=system"时 boost 链接错误

C++ 角度、三角学

c++ - 使用C++解析HTTP请求流: any not state machine way with same speed or better?

c++ - 为什么有些程序以未定义的行为执行而其他程序却没有?

C++11:在不知道其容器的情况下存储迭代器

c++ - regex_replace,为什么它会丢失 $1?

C++ 代码运行时缺少 header ,为什么?

c++ - 使用纯多态性和继承从基类调用派生类上的函数而不进行强制转换?

c++ - 在 C++ 中解析字符串

c++ - std::string 未正确终止