int main(){
multiset<string> graph;
graph.insert("a");
graph.insert("b");
multiset<string>::iterator it = graph.begin();
cout << *(it + 1) // Wrong
cout << *++it; // True
return 0;
}
为什么编译器在执行*(it + 1)
时会抱怨,但*(++it)
可以很好地执行。it + 1
和++it
不应该返回相同的值吗?
RandomAccessIterator允许添加任意偏移量,如it + n
,但multiset
只有BidirectionIterator。有关迭代器类别的更多信息,请参阅此处:https://en.cppreference.com/w/cpp/iterator#Iterator_categories.
原则上你是正确的,it+1
和++it
都将迭代器递增一。如果迭代器支持++it
,它也可以支持it+n
。然而,我们的想法是RandomAccessIterator可以在恒定时间内执行it+n
,而不是RandomAccess Iterator的迭代器需要执行n次单增量。因为这是相当低效的,他们不支持开箱即用。
如果要将非RandomAccessIterator增加1
以上,可以使用std::next
或std::advance
。通过调用std::next
/std::advance
,代码更清楚地表达了递增迭代器是一个潜在的昂贵操作,而it + n
预计需要恒定的时间(因此,当它不需要恒定的时候是不允许的)。
因为std::multiset
迭代器需要满足BidirectionalIterator的要求,这意味着它必须支持operator++
和operator--
。不需要支持其他操作,如加法或减法。
迭代器是一个符合结构的对象,每个迭代器的工作方式不同,这取决于您使用的结构(map、set、vector等)
迭代器是用函数定义的,在C++中,您可以重载运算符,如+、-、*、()、[]、,所以定义的++函数可能与运算符不同导致错误的CCD_ 21。
如果您支持+ 1
,您还必须支持+ N
。为了使编写低效代码变得更加困难,+ N
只支持它在恒定时间内工作的迭代器(例如,std::vector
支持它)。