【发布时间】:2013-07-16 07:36:51
【问题描述】:
我有一些私有类成员,表示包含一些数据的std::deque 的随机访问数组:
std::vector<std::deque<SomeDataClass> > someMember;
我想提供一个公共类方法,它返回可迭代的数据结构,包含我的双端队列数组中的所有数据元素:
std::deque<SomeDataClass> someMethod();
我希望这个方法遍历向量中的所有双端队列,并将沿途的每个元素复制到本地 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;
}
我在 deque 标头中的运行时收到数据访问冲突未处理的异常错误。什么是错误?
【问题讨论】:
-
在使用迭代器时,您应该始终使用
!=作为结束条件。没有什么能说明下一个在记忆中更靠前。 -
是的,谢谢。我会编辑我的问题,愚蠢的错误。我仍然有访问冲突。
-
@chris:只要容器是向量,除了标准之外,没有什么比这更重要的了。无论如何,对于随机访问迭代器,
operator<不会告诉您内存中的顺序,而是逻辑顺序中的顺序(对于其他迭代器类别,根本没有定义)。由于 vard 代码中使用的唯一容器是 vector 和 deque,它们都有随机访问迭代器,因此在它们上使用operator<非常好(当然,只要两个迭代器属于同一个容器)。 -
@celtschk,我知道有人会对此发表评论。是的,随机访问迭代器可以与
operator<一起正常工作,但我重视能够在不破坏其他所有内容的情况下进行更改。使用operator!=适用于每个迭代器类型。我应该把它说得更清楚一点,但是当我想到它的时候,我的五分钟已经过去了。