[c++]set整理
2016-04-21 23:08
309 查看
1. set中元素必须有比较的方法
set中元素必须有比较顺序的方法,如下,如果自定义一个struct类型Node,定义set<Node>不会出错,向set中插入元素时编译出错:
1) 提供全局operator <操作
待补充set模板及traits less的说明
如果operator<定义在Node中也不行?
重载class或者struct的()运算符
struct成员默认是public的
class成员默认是private的,需要修改访问限定
2. set中元素是如何判定相等的
相等不是通过operator==比较的,通过小于操作就可以退出相等关系
如果 x < y == false && y < x ==false => x==y
假如将 operator<的返回值设定为false,则set中最多只有一个元素
假如将 operator<的返回值设定为true,则set中插入第二个元素是会出现异常 opeartor < 定义有误
3. 删除导致的迭代器失效问题
遇到一个问题,需要将set1遍历一遍,将符合要求的元素放到set2中,同时把set1中的元素删除,比较蹩脚的实现方法,考虑更优化的方法
set中元素必须有比较顺序的方法,如下,如果自定义一个struct类型Node,定义set<Node>不会出错,向set中插入元素时编译出错:
#include <iostream> #include <set> using namespace std; struct Node{ int i; int j; Node(int ii,int jj):i(ii),j(jj){} void print() { cout<<i<<" "<<j<<endl; } }; bool comp1(const Node& lhs,const Node& rhs){ return lhs.i < rhs.i; } typedef bool (*pfun)(const Node&,const Node&); int main () { set<Node> s1; //for(int i=0;i<1;i++) //{ // s1.insert(Node(i,i)); //} getchar(); return 0; }提供元素比较的方法:
1) 提供全局operator <操作
待补充set模板及traits less的说明
如果operator<定义在Node中也不行?
bool operator<(const Node& lhs,const Node& rhs){ return lhs.i < rhs.i; }2)使用函数指针
bool comp1(const Node& lhs,const Node& rhs){ return lhs.i < rhs.i; } typedef bool (*pfun)(const Node&,const Node&); int main () { pfun p1=comp1; set<Node,pfun> s1(p1); for(int i=0;i<4;i++) { s1.insert(Node(i,i)); } for(auto i:s1) { i.print(); } getchar(); return 0; }使用函数指针时,介意使用typedef,否则代码会是这个样子
bool comp1(const Node& lhs,const Node& rhs){ return lhs.i < rhs.i; } int main () { bool (*p1)(const Node&,const Node&)=comp1; set<Node,bool (*)(const Node&,const Node&)> s1(p1); for(int i=0;i<4;i++) { s1.insert(Node(i,i)); } getchar(); return 0; }遇到了一个问题,放这里
for(set<Node,bool (*)(const Node&,const Node&)>::iterator it=s1.begin();it!=s1.end();++it) { <span style="white-space:pre"> </span>it->i; //Ok it->print();//wrong “Node::print”: 不能将“this”指针从“const Node”转换为“Node &” }3)使用函数对象
重载class或者struct的()运算符
struct成员默认是public的
class成员默认是private的,需要修改访问限定
struct comp2{ bool operator()(const Node& lhs,const Node& rhs){ return lhs.i < rhs.i; } }; int main () { //bool (*p1)(const Node&,const Node&)=comp1; //set<Node,bool (*)(const Node&,const Node&)> s1(p1); set<Node,comp2> s1; for(int i=0;i<4;i++) { s1.insert(Node(i,i)); } for(set<Node,comp2>::iterator it=s1.begin();it!=s1.end();++it) { cout<<it->i<<" "<<it->j<<endl; //Ok } getchar(); return 0; }
2. set中元素是如何判定相等的
相等不是通过operator==比较的,通过小于操作就可以退出相等关系
如果 x < y == false && y < x ==false => x==y
假如将 operator<的返回值设定为false,则set中最多只有一个元素
假如将 operator<的返回值设定为true,则set中插入第二个元素是会出现异常 opeartor < 定义有误
3. 删除导致的迭代器失效问题
遇到一个问题,需要将set1遍历一遍,将符合要求的元素放到set2中,同时把set1中的元素删除,比较蹩脚的实现方法,考虑更优化的方法
set<Node,comp2> s2; Node n(2,2); for(set<Node,comp2>::iterator it=s1.begin();it!=s1.end();) { if(comp2()(n,*it)) //低效 comp2 p2; p2(n,*it) { s2.insert(*it); set<Node,comp2>::iterator temp=it; temp++; s1.erase(it); it=temp; }else ++it; }
相关文章推荐
- C语言问卷调查
- vtk的小总结(1):基础知识
- POJ 3264 Balanced Lineup 查询区间最大最小值 基础线状树水题
- C语言 单向链表的创建、遍历、排序、删除操作
- c语言自评
- C++播放音频
- 关于C语言的问卷调查
- 矩阵相乘(分治法)
- OpenCv学习笔记--支持向量机SVM之C++的实现(1)
- C语言自评
- C++实验4—乘法口诀表
- VC++2005 express 完整版 下载地
- c++作业4
- osx c++连接mysql
- 大一新手学习线性表-顺序表的合并(C语言)
- 时针分针重合问题
- HDU 1698 Just a Hook 线状树经典模型之区间变动bool标记,上下同时更新
- C语言的调查
- C++设计模式之工厂模式
- Leetcode 6. ZigZag Conversion