在std :: copy中推进列表迭代器时出错

时间:2015-10-12 14:37:12

标签: c++

#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
using std::list;
using std::endl;
using std::cout;
using std::iterator;
int main()
{
    list<int> list_int{ 0,1,2,3,4,5,6,7,8,9 };
    list<int> list_int2;

    copy(list_int.crbegin()+3 , list_int.crbegin()+8,back_inserter(list_int2));
    for (auto &ele : list_int2)
        cout << ele << endl;

    return 0;
}

有什么不对?我很困惑。我认为关于复制功能是错误的。

错误:

enter image description here

2 个答案:

答案 0 :(得分:6)

您不能通过使用多个列表递增列表iterator(双向非随机)。换句话说,仅为双向迭代器定义operator++operator--。请改用std::next

copy(std::next(list_int.crbegin(), 3), 
     std::next(list_int.crbegin(), 8),
     back_inserter(list_int2));

std::nexttag-dispatch传递给正确的内部迭代器函数,该函数实际上将重复递增迭代器。

答案 1 :(得分:1)

list_intlist_int2属于std::list类型。 std::list的迭代器不支持随机访问。因此,您无法通过添加list_int.crbegin() + 3之类的整数来推进它们。

您可以复制列表迭代器并使用std::advance来推进它们。见docs