关于递增迭代器的困惑

o o*_*o o 4 c++ iterator

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返回相同的值吗?

for*_*818 5

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