通过C ++中的迭代器对集合中的集合进行突变

时间:2019-02-23 00:01:39

标签: c++ iterator

我想对“ out”进行大致这样的突变:

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

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

上面的代码将编译错误:

  

将“ const std :: __ cxx11 :: list”作为“ this”参数传递,它会丢弃限定词[-fpermissive] it.push_front(2);

我隐约知道这种情况可能会丢弃某些const限定词。有没有解决的办法,还是应该采用其他方法?

1 个答案:

答案 0 :(得分:1)

在集合中插入某些内容时,会将其放置在红黑树中,以表示排序顺序并帮助唯一值插入。插入后更改值将破坏集合的核心功能。

C ++文档中的设置迭代器具有注释

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

  

由于iterator和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;
}