Дублирование std :: list с помощью std :: copy и удаление с std :: list :: erase - PullRequest
4 голосов
/ 02 апреля 2019

В приведенном ниже коде примера после присвоения списка примеров с номерами я пытаюсь продублировать контейнер с std::copy, но проблема во время выполнения: "не может разыменовать итератор конечного списка".

мой вопрос: как мне продублировать список, чтобы дублированный диапазон был вставлен в конец списка?

до конца, потому что позже мне нужно будет удалить дублированный диапазон, поэтому я сохраняю начало нового диапазона в итераторе.

#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 ]

2 голосов
/ 02 апреля 2019

Вы можете использовать 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 голос
/ 02 апреля 2019
 if (!mylist.empty()) --iter;

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

К сожалению, мы не можем использовать конечный итератор в copy (), так как это может привести к бесконечному циклу, так как новые элементы добавляются между конечным и текущим итератором все время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...