#include <iostream>
#include <algorithm>
#include <functional>
#include <string>
#include <iterator>
#include <set>
using namespace std;
class Programmer
{
public:
Programmer(const int id, const wstring name) //初始化
:Id(id), Name(name){}
void Print()const
{
wcout << L"[" << Id << L"] : " << Name << endl;
}
Programmer SetName(wstring Name)
{
this->Name = Name;
return *this;
}
wstring GetName()
{
return Name;
}
int Id;
wstring Name;
};
struct ProgrammerIdGreater
{
bool operator()(Programmer p1,Programmer p2){
return(p1.Id < p2.Id) ? true : false;
}
};
struct ProgrammerNameGreater {
bool operator()(const Programmer&p1, const Programmer&p2)const{
return (p1.Name < p2.Name) ? true : false;
}
};
void initial(Programmer const& obj)
{
obj.Print();
}
int main()
{
wcout<<Programmer(1, L"get a name").GetName();
const int size = 6;
const Programmer personArray[size] = {
Programmer(1, L"Scott Meyers"),
Programmer(2, L"Martin Fowler"),
Programmer(3, L"Bill Gates"),
Programmer(4, L"P.J. Plaught"),
Programmer(5, L"Stanley B. Lippman"),
Programmer(6, L"Andrei Alexandrescu"),
};
set<Programmer, ProgrammerIdGreater>
ps1(personArray, personArray + size);
set<Programmer, ProgrammerNameGreater>
ps2(personArray, personArray + size);
cout << "(order by Id)以下是各个人物的ID,名字:" << endl;
for_each(ps1.begin(), ps1.end(),initial);
cout << endl;
cout << "查找Bill Gates:" << endl;
set<Programmer>::iterator it
= ps1.find(Programmer(3, L""));
if(it != ps1.end())
{
wcout << (*it).Name << " " << (*it).Id << endl;
}
cout << endl;
set<Programmer>::iterator it2
= ps2.find(Programmer(3, L"Bill Gates"));
if (it2 != ps2.end())
{
const_cast<Programmer&>(*it2).SetName(L"David Vandevoorde");
}
cout << "(order by Name)以下是各个人物的ID,名字:" << endl;
for_each(ps2.begin(), ps2.end(),initial);
cout << endl;
system("pause");
return 0;
}
整段代码最值得分析的地方在:
set的定义是:
它的两个参数是分别是 可复制、可拷贝的类型 和 排序准则。
set是关联式容器,通过红黑树实现,
上述画红线的句子酷的地方在于将set和数组组合在一起了,
更准确点讲,以数组的方式将元素放入set容器。
set<int> s2(s1.begin(),s1.end());
这行代码有助于理解, 即set容器声明了,怎样initial呢? :
(s1.begin(),s1.end())
以上。