下面来说一下一个关于set的问题。
面试官:set的底层是用什么实现的?
面试者:二叉树。。。。。
面试官:(内心独白:这个都不知掉……)。有一个结构体,里面有两个字符串,如何在一个set中查找这个结构体?
面试者:...........(内心独白:我平时做的都是int、long long,string 啊,哪里有结构体)。这个还真不知道。
其实这个问题也是很简单的,对于复杂的数据结构,stl中提供了自定义的方法进行处理,下面就以结构体为例,实现set的插入和查找。
#include <iostream> #include <set> #include <iterator> using namespace std; struct TSimInfo{ char szbegin[32]; char szend[32]; TSimInfo(){memset(this,0x0,sizeof(TSimInfo));} bool operator==(const TSimInfo &stSiminfo) const{ if(strcmp(this->szbegin,stSiminfo.szbegin)<=0 && strcmp(this->szend,stSiminfo.szend)>=0){ return true; } else { return false; } } }; class compoper{ public : bool operator() (const TSimInfo &left,const TSimInfo &right) const { if(strcmp(left.szbegin,right.szbegin)>=0){ return true; } else if(strcmp(left.szend,right.szend)>=0){ return true; } else { return false; } } }; int main(int argc, char *argv[]) { TSimInfo stTest; strcpy(stTest.szbegin,"222222222"); strcpy(stTest.szend,"333333333"); if(strcmp(stTest.szbegin,stTest.szend)>0){ cout<<"输入参数错误"<<endl; return 0; } set<TSimInfo,compoper> setV; TSimInfo tmp; strcpy(tmp.szbegin,"1111111"); strcpy(tmp.szend, "5555555"); setV.insert(tmp); strcpy(tmp.szbegin,"666666666"); strcpy(tmp.szend, "8888888888"); setV.insert(tmp); if(std::find(setV.begin(),setV.end(),stTest)==setV.end()){ cout<<"no"<<endl; } else { cout<<"ok"<<endl; } return 0; }就是这么简单,很多时候不是不会,而是你没去看。