为什么我无法更改"set<set>"循环中的值<int>
why I cannot change the value in loop of `set<set<int>>`
这是我的问题的最小函数:
void solve(void)
{
set<set<int> > test;
for(set<set<int> >::iterator it = test.begin(); it != test.end(); ++it) {
// (*it)'s type is set<int> right? but why I cannot insert a int into this?
it -> insert(1);
}
}
编译器告诉我no matching function for call to 'std::set<int>::insert(int) const'
。
我真的很困惑,为什么它不使用没有const
的std::set<int>::insert(int)
?我该怎么做?我真的能做到吗?
*** first edited ***
我知道我可以擦除像it = test.erase(it)
这样的元素,我也知道我可以使用test.insert(<a set<int> value>)
,所以可以先插入然后删除原始元素吗?但是看起来很麻烦,对吧?
*** seconed edited ***
关于用例:在我知道Disjoint集数据结构之前,我想解决它的问题,所以我需要处理set<set<int>> type data
中的set<int> type data
。我发现我无法更改循环中的内部set
,因此无法合并这些内部集,这让我很沮丧。(或者我可以,我尝试将内部集值的那些元素放入临时set
中,然后删除原始set
s,然后将临时set
插入set<set>
中。但它看起来确实很难看(。所以我知道要做它,但我不知道为什么迭代器是const
,我也想知道在set
中处理set
的更好方法。
*** third edited ***
感谢@anurag dhadse指出语法错误。
谢谢。
您的it->insert(1)
试图更改外部set<set<int>>
中的set<int>
,这样做可能会更改*it
在外部set
中的存储位置,这将通过不保持元素排序而违反类不变量。为了避免这种情况,外部set
只允许it
const
访问set<int>
元件
如果你想修改一个set<int>
元素,你需要从外部set
中extract
,修改它,然后insert
把它放回它现在应该放的地方。
您意识到,如果您在一个"外部";集合,这些内部集合将按字典顺序排列:
#include <set>
#include <vector>
#include <iostream>
using namespace std;
int main () {
set A1 = {2, 7};
set A2 = {1, 8, 3, 4};
set A3 = {1, 4, 3};
set<set<int>> set_of_sets;
set_of_sets.insert(A1);
set_of_sets.insert(A2);
set_of_sets.insert(A3);
for ( auto& inner_set : set_of_sets ) {
std::cout << "[ " ;
for ( auto &element : inner_set ) {
std::cout << element << " ";
}
std::cout << "]n";
}
}
将产生以下响应:
[ 1 3 4 ]
[ 1 3 4 8 ]
[ 2 7 ]
他们改变了顺序,不仅改变了每个集合中的整数,而且A1被A3(遵循字典顺序(交换
https://godbolt.org/z/nacxrn
如果将1
插入到每个集合中,[1 3 4]将不会更改,[1 3 4 8]也不会更改,但[2 7]将变为[1 2 7],这意味着A1应该再次被A3替换,因为[1 2 7]<[1 3 4],因此C++不允许在迭代过程中更改内集在外集内的位置(通过使迭代器常量(。
所以,现在还不清楚你为什么要使用一个集合。(对于许多应用程序(只需使用集合的向量,就可以自由更改它们:
vector<set<int> > test { A1, A2, A3 } ;
for(auto& s : test ) {
s.insert(1); /// inserting 1 in all sets
}
https://godbolt.org/z/WMvse9
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- EASTL矢量<向量<int>>连续的
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- 是std :: set&lt; std :: future&gt;不可能存在
- std::map<std::set, double> AND std:<long>map< std::p air<long, long>, double>