【发布时间】:2013-07-09 19:22:28
【问题描述】:
我有一个std::list<int> 和一个std::vector<int>。我想从中删除 even 元素,并在其中复制 odd 元素。
我对它们都有两个不同的功能:
矢量:
std::vector<int> vec_remove_even_duplicate_odd(std::vector<int> target) {
std::vector<int>::iterator begin = target.begin();
while (begin != target.end()) {
if (*begin % 2 == 0) {
begin = target.erase(begin);
} else {
begin = target.insert(begin, *begin);
begin += 2;
}
}
return target;
}
这很好用。但是std::list<int> 的相同函数在begin += 2 行显示错误:
error: no match for ‘operator+=’ (operand types are ‘std::list<int>::iterator {aka std::_List_iterator<int>}’ and ‘int’)
如果我将其更改为:
begin = begin + 2
它显示以下注释:
note: mismatched types ‘const std::reverse_iterator<_Iterator>’ and ‘int’
但是,如果我将该行更改为:
++begin;
++begin;
它也适用于list。那么这种行为是什么,我在阅读容器时可能会错过。
为什么没有为std::list<T>::iterator 定义+= 运算符?以及为什么简单的+ 操作员的消息?我什至还没有创建reverse_iterator?
我知道vector 是一个连续 结构,而list 不是。但是,考虑到 post-increment 是适用的,这又有什么关系呢?
这个问题是特定于list 的,还是其他一些容器也有这个问题?
【问题讨论】:
-
由于
std::list不是连续的,它的迭代器一次只能移动一个,所以++有效,但+无效。见stackoverflow.com/questions/5211914/… 和cplusplus.com/reference/iterator/BidirectionalIterator -
@MooingDuck。谢谢。不知道不同类型的迭代器。现在很清楚了。 :)
标签: list c++11 vector iterator operators