在下面的代码中,我们无法使用非常量引用来迭代集合
s1
。为什么?
#include <set>
struct st {
unsigned int f;
std::set<int> s2;
};
struct comp {
bool operator()(const st &lhs, const st &rhs) const {
return lhs.f < rhs.f;
}
};
int main() {
std::set<st, comp> s1;
st x;
for (st &m : s1) // error here. requires const st&
m.s2.insert(begin(x.s2), end(x.s2));
return 0;
}
来自 C++17 标准(26.2.6 关联容器)
5 对于集合和多重集,值类型与键类型相同。 对于地图和多重地图,它等于pair
。 6 关联容器的迭代器是双向的 迭代器类别。 对于值类型的关联容器 与 key 类型相同,iterator 和 const_iterator 都是 常量迭代器。
因此在这个基于范围的 for 循环中
for (st &m : s1)
你不能使用非常量引用。
注意您创建了一个空集。
std::set<st, comp> s1;
所以无论如何循环都没有意义。