我有一些私有(private)类成员,代表包含一些数据的 std::deque
的随机访问数组:
std::vector<std::deque<SomeDataClass> > someMember;
我想提供一个公共(public)类方法,它返回可迭代的数据结构,其中包含来 self 的双端队列数组的所有数据元素:
std::deque<SomeDataClass> someMethod();
我希望此方法遍历 vector 中的所有双端队列,并将其途中的每个元素复制到本地 std::deque,最终按值返回此本地 std::deque。
我正在尝试使用 C++11 auto
和 std::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/