C++ Can';t将元素插入嵌套的stl整数集中
我有一个嵌套的整数集,但我不能将元素插入到嵌套的集合中C++ Can';t将元素插入嵌套的stl整数集中,c++,stl,set,iterator,C++,Stl,Set,Iterator,我有一个嵌套的整数集,但我不能将元素插入到嵌套的集合中 std::set<std::set<int> > centre_as_set = bitset_to_set(centre->second->bit_partitions); std::set<std::set<int> >::iterator set_itr; for ( set_itr = centre_as_set.begin(); set_itr != centre_as_
std::set<std::set<int> > centre_as_set = bitset_to_set(centre->second->bit_partitions);
std::set<std::set<int> >::iterator set_itr;
for ( set_itr = centre_as_set.begin(); set_itr != centre_as_set.end(); ++set_itr ) {
set_itr->insert(4);
std::set<int>::iterator node_itr;
for ( node_itr = set_itr->begin(); node_itr != set_itr->end(); ++node_itr ) {
std::cout << *node_itr;
}
}
}
std::set center\u as\u set=bitset\u to\u set(center->second->bit\u分区);
std::set::迭代器set\u itr;
for(set_itr=centre_as_set.begin();set_itr!=centre_as_set.end();+set_itr){
设置itr->insert(4);
std::set::迭代器节点\u itr;
对于(node_itr=set_itr->begin();node_itr!=set_itr->end();+node_itr){
std::cout'
作为
'std::pair,\u Compare,
类别名
_Alloc::rebind::other>::常量迭代器,
bool>std::set::insert(const _Key&)[with _Key=int,_Compare=std::less,_Alloc=
std::分配器]'丢弃
限定词
我不能很好地解释模板错误,非常感谢任何帮助。编辑:根据georg的评论,这个答案是错误的
我这里没有编译器,但是std::set的完整声明是:
template < class Key, class Compare = less<Key>,
class Allocator = allocator<Key> > class set;
template类集合;
最外层集合的“键”是“std::set”。比较器是“std::less>”或short“operator集合中的元素是不可变的,您正在尝试使用非常量成员函数insert()
在std::set
的const
实例上。如果您在stl\u set.h
中的声明中遵循迭代器
符号,则会有以下很好的注释:
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR 103. set::iterator is required to be modifiable,
// but this allows modification of keys.
typedef typename _Rep_type::const_iterator iterator;
C++98和C++03允许修改,但这是一个缺陷,已在非古代GCC版本和VC10中修复。可以找到提到的缺陷报告,并将纳入下一个标准
例如,使用类似于以下内容的内容来添加值4
:
// Readability:
typedef std::set<int> IntSet;
typedef std::set<IntSet> IntSetSet;
// Helper:
IntSetSet add_value_to_sets(const IntSetSet& in, int i) {
IntSetSet ss;
IntSetSet::iterator set_itr;
for ( set_itr = in.begin(); set_itr != in.end(); ++set_itr ) {
IntSet s = *set_itr;
s.insert(4);
ss.insert(s);
}
return ss;
}
// ...
IntSetSet centre_as_set =
add_value_to_sets(bitset_to_set(centre->second->bit_partitions), 4);
//可读性:
typedef std::set IntSet;
typedef std::set IntSetSet;
//助手:
IntSetSet将值添加到集合(常量IntSetSet&in,int i){
INTSETSETSS;
IntSetSet::迭代器集_itr;
for(set_itr=in.begin();set_itr!=in.end();+set_itr){
IntSet s=*set_itr;
s、 插入(4);
ss.插入(s);
}
返回ss;
}
// ...
IntSetSet中心作为集合=
将\u值\u添加到\u集合(位集合\u到\u集合(中心->第二->位分区),4);
有一个运算符,它不是运行时错误,而是编译错误,这就是他的问题所在。噢,我不知道我是否喜欢这个glibcxx功能。这有效地防止了更改集合内容,即使更改不会影响排序。例如,更改未比较的属性。我想说的是大多数用例对于我来说,这绝对比在运行时意外破坏一切要好。