C++ 设置迭代器错误:在集合中不匹配‘operator+=’

问题描述

auto str=lower_bound(s.begin(),s.end(),n);


cout<<std::distance(s.begin()+1,str)+1;

为什么 +1s.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()