c++ - 我们可以在没有 'advance' 函数的情况下增加迭代器多个位置吗?

标签 c++ c++11 iterator listiterator

我知道我们可以使用 advance() 函数来增加迭代器。我们还使用 iterator++ 将迭代器增加一位。为什么我们不能使用 it+=2

int main()
{
    list<int> l1{1, 2, 3, 5, 6};
    list<int> l2{2, 6, 8};
    auto it = l1.begin();
    advance(it, 2);         //works
    it++;                   //works
    // it+=2;                  //not work
    l2.splice(l2.begin(), l1, it);

    for(int a: l2) cout<<a<<" ";
    cout<<endl;

    return 0;
}

你可以运行上面的代码here .

最佳答案

operator += 仅受 RandomAccessIterator 支持;请注意,它应该具有恒定的复杂性。

std::list 的迭代器是 BidirectionalIterator ,不支持 operator +=。 (std::vectorstd::array的迭代器是RandomAccessIterator。)

请注意,它们都可以与 std::advance 一起使用, 当用于 RandomAccessIterator 时,复杂度是常数;当用于其他 InputIterators(包括 BidirectionalIterator)时,复杂度是线性的。这意味着使用 std::advance 是个好主意,因为它更通用,可以自动利用 RandomAccessIterator 的优势。

关于c++ - 我们可以在没有 'advance' 函数的情况下增加迭代器多个位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53002491/

相关文章:

c++ - 将类定义传递给基类时,类定义是否完整?

c++ - 为什么我们在这里增加 ostream 迭代器

java - 如何迭代 Collection<T> 并修改其项目而不出现 ConcurrentModificationException?

c++ - 将二维数组的一行分配给一维矩阵

c++ - 重定义struct报错,我只定义了一次

c++ - 我如何创建一个接受 map 或 unordered_map 的函数?

ruby-on-rails - 在 Ruby 中循环时获取额外信息

c++ - 如何抛出文件和行号错误?

c++ - libstdc++新标准库特性支持表

C++11 中的 Unicode 标识符和源代码?