pro*_*ian 7 c++ stl set-intersection
我有一个像这样的代码片段,在VC++ 2010下编译.
std::set<int> s1;
std::set<int> s2;
std::set<int> res_set;
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), res_set.begin());
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该有效.但是,我得到了构建错误:
c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(4494): error C3892: 'std::_Tree_const_iterator<_Mytree>::operator *' : you cannot assign to a variable that is const
1> with
1> [
1> _Mytree=std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(4522) : see reference to function template instantiation '_OutIt std::_Set_intersection<_InIt1,_InIt2,_OutIt>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)' being compiled
1> with
1> [
1> _OutIt=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>,
1> _InIt1=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>,
1> _InIt2=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(4549) : see reference to function template instantiation '_OutIt std::_Set_intersection1<std::_Tree_unchecked_const_iterator<_Mytree>,std::_Tree_unchecked_const_iterator<_Mytree>,_OutIt>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt,std::tr1::true_type)' being compiled
1> with
1> [
1> _OutIt=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>,
1> _Mytree=std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>,
1> _InIt1=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>,
1> _InIt2=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>
1> ]
1> c:\p4r\pkrcode\depot\dev\stats\poker\protype\statserver\achievementmanager.cpp(175) : see reference to function template instantiation '_OutIt std::set_intersection<std::_Tree_const_iterator<_Mytree>,std::_Tree_const_iterator<_Mytree>,std::_Tree_const_iterator<_Mytree>>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)' being compiled
1> with
1> [
1> _OutIt=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>,
1> _Mytree=std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>,
1> _InIt1=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>,
1> _InIt2=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<int,std::less<int>,std::allocator<int>,false>>>
1> ]
Run Code Online (Sandbox Code Playgroud)
为此,我做了明确的模板参数声明:
std::set_intersection<std::set<int>::const_iterator, std::set<int>::const_iterator, std::set<int>::iterator>(
s1.begin(), s1.end(), s2.begin(), s2.end(), res_set.begin()
);
Run Code Online (Sandbox Code Playgroud)
但我有同样的错误.我的问题在于,在第二种情况下,如果我传递一个const_iterator,它会因const参议类型不匹配而在const_iterator和iterator之间出现转换错误.我在这里缺少什么?(我知道set_intersection的"插入器"形式,但我想知道我在这里做错了什么)
jpa*_*cek 11
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), res_set.begin());
Run Code Online (Sandbox Code Playgroud)
最后一个参数应该是输出迭代器.在你的情况下,它不是,甚至更多,它是不可变的(bc.std::set具有不可变元素).您应该使用insert_iterator:
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(res_set, res_set.end()));
Run Code Online (Sandbox Code Playgroud)
res_set.begin()不能用作输出参数有set_intersection两个原因:
相反,您需要一个insert_iterator,将新元素插入到集合中:
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
std::inserter(res_set, res_set.end()))
Run Code Online (Sandbox Code Playgroud)
a的输出参数std::set_intersection必须是可变的
value_type.std::set永远不支持变异的迭代器,因为改变元素的值可能会改变它在集合中的位置.组中的功能std::set_iterator旨在用于排序序列,例如std::vector.
在您的情况下,您可以替换您std::set的std::vector,根据需要std::lower_bound对它们进行排序(并可能使用和插入以保持它们在插入时排序),或使用
std::insert_iterator( res_set, res_set.end() ).
| 归档时间: |
|
| 查看次数: |
8130 次 |
| 最近记录: |