关于递增迭代器的困惑


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::nextstd::advance。通过调用std::next/std::advance,代码更清楚地表达了递增迭代器是一个潜在的昂贵操作,而it + n预计需要恒定的时间(因此,当它不需要恒定的时候是不允许的)。

因为std::multiset迭代器需要满足BidirectionalIterator的要求,这意味着它必须支持operator++operator--。不需要支持其他操作,如加法或减法。

迭代器是一个符合结构的对象,每个迭代器的工作方式不同,这取决于您使用的结构(map、set、vector等)

迭代器是用函数定义的,在C++中,您可以重载运算符,如+、-、*、()、[]、,所以定义的++函数可能与运算符不同导致错误的CCD_ 21。

如果您支持+ 1,您还必须支持+ N。为了使编写低效代码变得更加困难,+ N只支持它在恒定时间内工作的迭代器(例如,std::vector支持它)。

相关内容

  • 没有找到相关文章

最新更新