我有std::list<std::string>
的迭代器,但是当我尝试使用+=
推进它时,我收到编译错误。
代码是:
#include <list>
#include <iostream>
#include <string>
int main() {
std::list<std::string> x;
x.push_front("British");
x.push_back("character");
x.push_front("Coding is unco");
x.push_back("Society");
x.push_back("City Hole");
auto iter = x.begin();
iter += 3;
//std::advance(iter, 3);
x.erase(iter);
for (auto &e: x) {
std::cout << e << "\n";
}
}
如果我使用clang++ -std=c++11 -o li li.cpp
编译,我得到:
li.cpp:13:10: error: no viable overloaded '+='
iter += 3;
~~~~ ^ ~
1 error generated.
为什么我不能将+=
与此迭代器一起使用?
答案 0 :(得分:15)
std::list的迭代器是BidirectionalIterator,它不支持operator+=
operator++
{/ 3}}。
您可以使用RandomAccessIterator支持的BidirectionalIterator
(包括++iter;
++iter;
++iter;
),例如
BidirectionalIterator
但它很难看。最好的方法就是您评论,使用InputIterator(或std::advance(自C ++ 11))代替,可以与std::next一起使用(包括RandomAccessIterator
) ,并利用InputIt
支持的功能。
(强调我的)
复杂性
线性
但是,如果
RandomAccessIterator
另外满足要求std::advance
,复杂性不变。
所以你可以在不考虑迭代器类别的情况下使用它,std::advance(iter, 3);
将为你做最好的选择。 e.g。
iter = std::next(iter, 3);
或
application.properties
答案 1 :(得分:5)
原因很简单,没有为您正在使用的双向迭代器定义+=
运算符。
对于所有迭代器至少有:
X b(a);
和b = a;
++a
和a++
其他所有内容取决于迭代器的类型,请查看表here:
正如您所看到的那样,随机访问迭代器可以解决问题。
答案 2 :(得分:3)
std::list::iterator
不是Random Access Iterator。不可能“超前”#34;列表中的几个元素,您必须遍历列表,直到到达所需的元素。您可以使用std::advance
来推断基于迭代器类别推进迭代器的最佳方法。在std::list::iterator
的情况下,它将在循环中递增迭代器。