Простой способ добавить элементы из одного списка в другой список - PullRequest
9 голосов
/ 18 ноября 2010

Каков «правильный» способ добавить все элементы из одного std :: list в другой?

void
Node::addChilds(const NodeList *list)
{
    for(NodeList::const_iterator i = list->begin();
        i != list->end();
        ++i)
        {
            this->m_childs.push_back(*i);
        }
}

Я думал о std :: copy, но для копирования я должен изменить размерсписок адресатов, резервное копирование конечного итератора (перед изменением размера) и т. д.

Я ищу однострочный оператор.

Ответы [ 4 ]

13 голосов
/ 18 ноября 2010
this->m_childs.insert(this->m_childs.end(), list->begin(), list->end());
12 голосов
/ 18 ноября 2010

Если элементы должны быть перемещены, вы можете использовать splice .В противном случае скопируйте их, как объясняется ybungalobill или larsmans.

12 голосов
/ 18 ноября 2010

Используйте back_insert_iterator.Если std::list<T> это тип m_childs,

std::copy(list.begin(), list.end(),
          std::back_insert_iterator<std::list<T> >(m_childs));
3 голосов
/ 07 сентября 2011

Скотт Мейерс пишет об этом конкретном предмете в " Effective STL ", в пункте 5 (и упоминает splice в пункте 4). Он предпочитает версию ybungalobill, но в основном потому, что считает код более понятным и понятным, поскольку в нем подчеркивается слово «вставка», а не слово «копия».

Почти все случаи использования std::copy, в которых используется итератор (например, back_inserter), могут быть заменены вызовами функций-членов диапазона (например, .insert(position, begin, end)).

splice - функция-член с постоянным временем, поэтому она будет быстрее, если она будет применима в данном конкретном случае.

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