Мутирование коллекций в коллекцию через итераторы в C ++ - PullRequest
0 голосов
/ 23 февраля 2019

Я хотел бы изменить 'out' примерно следующим образом:

set<list<int>> out = {{1, 2, 3}, {6, 7, 8}};

for (auto &it : out)
{
    it.push_front(2);
}

Код выше будет скомпилирован с ошибкой:

, передавая const std :: __ cxx11:: list 'as' this 'аргумент отбрасывает квалификаторы [-fpermissive] it.push_front (2);

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

1 Ответ

0 голосов
/ 23 февраля 2019

При вставке чего-либо в набор оно помещается в красно-черное дерево, чтобы отобразить порядок сортировки и помочь с вставкой уникального значения.Изменение значения после вставки нарушило бы основные функциональные возможности наборов.

Итераторы набора в документах C ++ имеют примечание

https://en.cppreference.com/w/cpp/container/set/begin

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

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

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

https://en.cppreference.com/w/cpp/container/list/begin

#include <list>
#include <iostream>

int main()
{
    std::list<std::list<int>> listOfLists = {{1, 2, 3}, {6, 7, 8}};

    for (auto& containedList : listOfLists)
    {
        containedList.push_front(2);
    }

    for (auto& containedList : listOfLists)
    {
        std::cout << "[";
        for (auto& listItem : containedList) {
            std::cout << listItem;
        }
        std::cout << "]" << std::endl;
    }

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