通过键删除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”中两个迭代器顺序的唯一方法是从一个迭代到另一个,这需要线性时间。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...