一个关于set的面试题

时间:2022-04-20 05:03:36
面试的时候经常会被问到stl,stl中最常问的就是vector,map还有set。如果面试官问你的是基础的问题这些还好回到,但是要是问你一些需要思考的问题呢?(面试官也要找存在感的,要是问的太浅,你都会还怎么混,哈哈)

下面来说一下一个关于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;
}
就是这么简单,很多时候不是不会,而是你没去看。