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;
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器在执行时会报错*(it + 1),但是*(++it)可以很好的执行。不应该it + 1和++it返回相同的值吗?
RandomAccessIterators 允许您添加任意偏移量,例如it + n,但multiset只有双向迭代器。有关迭代器类别的更多信息,请参见此处:https : //en.cppreference.com/w/cpp/iterator#Iterator_categories。
在原则上,你是正确的,这it+1和++it两个增量迭代器之一。如果迭代器支持,++it它也可以支持it+n. 然而,这个想法是 RandomAccessIterators 可以it+n在恒定时间内执行,而不是 RandomAccessIterators 的迭代器需要执行 n 次单次增量。因为这是相当低效的,所以他们不支持开箱即用。
如果您想将非 RandomAccessIterator 增加的数量超过1您可以使用的std::next或std::advance。通过调用std::next/std::advance代码更清楚地表示递增迭代器是一个潜在的昂贵操作,而it + n预计需要花费恒定时间(因此当它不需要恒定时间时是不允许的)。