关于使用set容器存放对象指针的一些问题:
1,当使用set容器存放对象指针时,不指定set第二个参数的情况下,默认是以指针的值得大小进行排序的
2,当需要以指定的方法进行排序的时候需要指定set的第二个参数,使用一个仿函数进行绑定判断条件(重载对象的小于号操作符并不能使set排序,因为存放的是指针,并不是对象本身,对象本身的时候小于号操作符是有效的)
仿函数的定义有两种方式:
第一种在对象内部定义仿函数
#include <set>
#include <iostream>
#define BMTS_SEQ_IS_LESS(seq1,seq2)\
((unsigned short)((unsigned short)(seq1) - (unsigned short)(seq2))> (unsigned short)(1<<15))
class ProtocolOperat{
public:
ProtocolOperat(void*data){
p =data;
}
int GetDataSeq(){
return *(unsigned short*)p;
}
void*p;
};
struct node{
struct NodeSortCriterion{
bool operator() (const node* a, const node* b) const {
ProtocolOperat p1(a->mpData);
ProtocolOperat p2(b->mpData);
unsigned short r1 = p1.GetDataSeq();
unsigned short r2 = p2.GetDataSeq();
bool ret = BMTS_SEQ_IS_LESS(r1,r2);
return ret;
}
};
void* mpData;
};
typedef std::set<node*,node::NodeSortCriterion> testSet;
using namespace std;
int main(){
unsigned short i1=1;
unsigned short i2=0xFFFF;
unsigned short i3=1;
node* p1 = new node;
node* p2 = new node;
node* p3 = new node;
p1->mpData =&i1;
p2->mpData =&i2;
p3->mpData =&i3;
testSet intset;
pair<testSet::iterator,bool>ret = intset.insert(p2);
if(ret.second == false){
printf("false\n");
}
ret = intset.insert(p1);
if(ret.second == false){
printf("false\n");
}
ret = intset.insert(p3);
if(ret.second == false){
printf("false\n");
}
getchar();
return 0;
}
第二种在对象外部定义仿函数,此方法的时候需对函数指针用typedef进行一次重定义(在VS2010上不进行重定义编译无法通过)
#include <set>
#include <iostream>
#define BMTS_SEQ_IS_LESS(seq1,seq2)\
((unsigned short)((unsigned short)(seq1) - (unsigned short)(seq2))> (unsigned short)(1<<15))
class ProtocolOperat{
public:
ProtocolOperat(void*data){
p =data;
}
int GetDataSeq(){
return *(unsigned short*)p;
}
void*p;
};
struct node{
void* mpData;
};
typedef node* NodePtr;
struct NodeSortCriterion{
bool operator() (const NodePtr& a, const NodePtr& b) const {
ProtocolOperat p1(a->mpData);
ProtocolOperat p2(b->mpData);
unsigned short r1 = p1.GetDataSeq();
unsigned short r2 = p2.GetDataSeq();
bool ret = BMTS_SEQ_IS_LESS(r1,r2);
return ret;
}
};
typedef std::set<NodePtr,NodeSortCriterion> testSet;
using namespace std;
int main(){
unsigned short i1=1;
unsigned short i2=0xFFFF;
unsigned short i3=1;
NodePtr p1 = new node;
NodePtr p2 = new node;
NodePtr p3 = new node;
p1->mpData =&i1;
p2->mpData =&i2;
p3->mpData =&i3;
testSet intset;
pair<testSet::iterator,bool>ret = intset.insert(p2);
if(ret.second == false){
printf("false\n");
}
ret = intset.insert(p1);
if(ret.second == false){
printf("false\n");
}
ret = intset.insert(p3);
if(ret.second == false){
printf("false\n");
}
getchar();
return 0;
}
定义完以后set容器就会按照仿函数定义的方法进行插入操作,当两个对象的值一致的时候插入失败而返回错误