对于我们自定义的一个类型,需要按其中某个属性去重复。 class PicResult{ public: int ID;//一个主属性 int PID;//副属性 PicResult(int _ID, int _PID): ID(_ID), PID(_PID){} bool operator<(const PicResult temp) {//重载<运算符 return ID<temp.ID; } bool operator==(const PicResult temp) { return PID==temp.PID; } }; bool lessThan(const PicResult temp1,const PicResult temp2) {//因为<已经重载过了,所以这里只能外部定义。 return temp1.PID<temp2.PID; } int main() { vector<PicResult> result; for (int i=0;i<100;++i) { result.push_back(PicResult(i,i%10)); }//生成用于测试的vector,ID是唯一的,PID是0-9之间的数,所以存在重复。 sort(result.begin(), result.end(), lessThan);//按PID从小到大排序,后面unique函数需要操作排好序的vecctor cout<<result.size()<<endl; //unique()函数把相邻的PID相同的对象只取第一个移动到result前边部分。 //(ID,PID)----按PID去重复 (1,1) (2,1),(3,2),(4,2) ->(1,1) (3,2) (3,2) (4,2);这里把(3,2)移动到前面覆盖掉“重复且不是第一个的对象”(2,1) vector<PicResult>::iterator newResult = unique(result.begin(), result.end());//newResult返回指向最后一个不重复对象的下一个位置,即[result.begin(), newResult) cout<<result.size()<<endl;//这里尺寸没有变化 //for (vector<PicResult>::const_iterator iter_begin = result.begin(); iter_begin!=result.end(); ++iter_begin) //{ // cout<<"ID="<<iter_begin->ID<<" PID="<<iter_begin->PID<<endl; //}//输出可以看到result的前面10个对象都是不重复的,10以后的对象并没有变化 result.erase(newResult, result.end());//删除后面发生重复且现在不需要的对象 //for (vector<PicResult>::const_iterator iter_begin = result.begin(); iter_begin!=result.end(); ++iter_begin) //{//输出查看效果 // cout<<"ID="<<iter_begin->ID<<" PID="<<iter_begin->PID<<endl; //} system("pause"); return 0; }