问题描述
auto str=lower_bound(s.begin(),s.end(),n);
cout<<std::distance(s.begin()+1,str)+1;
为什么 +1
在 s.begin()
后不起作用?它表明 operator+
没有匹配项(操作数类型是 'std::set::iterator'...)
解决方法
std::set
迭代器是 bi-directional 迭代器,只需要实现 --
和 ++
运算符。 Random-access 迭代器实现了 +
/-
和 +=
/-=
运算符。
当迭代器未实现 operator+
时,您可以使用 std::advance()
或 std::next()
向前移动迭代器,例如:
auto str = std::lower_bound(s.begin(),s.end(),n);
auto iter = s.begin();
std::advance(iter,1);
cout << std::distance(iter,str) + 1;
auto str = std::lower_bound(s.begin(),n);
cout << std::distance(std::next(s.begin()),str) + 1;
,
A std::set::iterator
不支持 operator+
(它是支持 operator--
和 operator++
的 LegacyBidirectionalIterator),所以它在这里失败:
s.begin() + 1
跳过+1
,它会起作用,但它不会是一个单一的操作。我必须从 s.begin()
前进到 str
才能计算距离:
std::cout << std::distance(s.begin(),str);
注意:为了获得与 std::distance(s.begin() + 1,str) + 1;
相同的结果,如果它有效,您也必须跳过 +1
之后的 std::distance()
。