使用std :: copy复制std :: list并使用std :: list :: erase删除

时间:2019-04-02 06:36:21

标签: c++ list copy

在下面的示例代码中,使用数字分配示例列表后,我尝试使用std::copy复制容器,但问题是在运行时提示“无法取消引用最终列表迭代器”。 < / p>

我的问题是如何复制列表,以便将重复的范围插入列表的末尾?

到最后,因为我后来需要能够删除重复的范围,这就是为什么我将新范围的开头保存到迭代器的原因。

#include <iostream>
#include <list>
#include <algorithm>

void print(std::list<int>& ref)
{
    for (auto& num : ref)
    {
        std::cout << num << std::endl;
    }
}

int main()
{
    std::list<int> mylist{ 1, 2, 3, 4 };
    std::list<int>::iterator iter = mylist.end();

    std::cout << "INITIAL LIST NUMBERS" << std::endl;
    print(mylist);

    // duplicate list, will cause runtime error
    iter = std::copy(mylist.begin(), mylist.end(), --mylist.end());

    std::cout << "COPIED LIST IS NOW CONTAINS DUPLICATE NUMBERS" << std::endl;
    print(mylist);

    // remove previsous duplication
    mylist.erase(iter, mylist.end());

    std::cout << "AFTER REMOVAL OF COPIED LIST SHOULD BE SAME AS INITIAL LIST" << std::endl;
    print(mylist);

    std::cin.get();
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您可以使用std::copy_n。这样可以避免std::copy的问题,当使用std::back_inserter(mylist)和始终有效的mylist.end()迭代器进行馈送时,它将执行插入的无限循环。

const std::size_t n = mylist.size();
std::copy_n(mylist.cbegin(), n, std::back_inserter(mylist));

重复数据删除然后可以使用

mylist.erase(std::next(mylist.begin(), n), mylist.end());

答案 1 :(得分:2)

 if (!mylist.empty()) --iter;

 std::copy_n(mylist.begin(), mylist.size(), std::back_inserter(mylist));
 if (!mylist.empty()) ++iter;

不幸的是,我们不能在copy()中使用end迭代器,因为它可能会导致无限循环,因为新的元素一直都在end和当前迭代器之间添加。