如何解决通过键删除STL std :: set元素时出现编译错误
|| 我有以下代码,在其中持有std :: set迭代器到int
s的STL容器,并通过键擦除元素(其中键是STL容器的迭代器)。如果容器为std :: vector,代码将按预期方式编译并运行(编译器为VC 2008),但如果容器为std :: list,则代码将无法编译
using namespace std;
typedef vector< int > Container; //--> fails to compile if \'vector\' is changed to \'list\'
typedef Container::iterator IntIt;
set< IntIt > itSet;
Container c;
c.push_back (1);
c.push_back (2);
c.push_back (3);
IntIt it = c.begin ();
itSet.insert (it++);
itSet.insert (it++);
itSet.erase (c.begin ()); //--> The problematic line
编译错误是:
c:\\ Program档案(x86)\\ Microsoft
视觉工作室
9.0 \\ VC \\ include \\ functional(143):错误C2784:\'bool std :: operator <(const
std :: _ Tree <_Traits>&,const
std :: _ Tree <_Traits>&)\':无法
推导\'const的模板参数
来自\'const的std :: _ Tree <_Traits>&\'
插入\'
因此在我看来,错误是因为编译器将模板的ѭ2之一解释为smaller than
运算符-但我无法真正理解为什么或如何解决它。
解决方法
该问题是由于“ 4”没有定义比较而引起的。
std::set
的值类型要求严格的弱排序。
vector
支持具有顺序的随机访问迭代器。只需要列表来支持没有顺序的双向迭代器(当然,实现也可以自由地支持列表的随机访问迭代器,因此在某些编译器上它可能会起作用)。
为了修复它,您必须自己编写一个比较函数。问题在于,检测“ 7”中两个迭代器顺序的唯一方法是从一个迭代到另一个,这需要线性时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。