Map和Set本质红黑二叉树,插入数据时可以自定义比较算法,list和vector链表插入时无需比较(所以一般全部插入完成后调用sort() )核心代码:
typedef struct MyStudent
{
std::string name;
int grade;
} Student;
//Lambda设置map排序规则,同样适合于set
auto func = [](const Student* left, const Student* right)
{
return left->grade < right->grade;
};
//定义map
std::map<const Student*, std::string,decltype(func)> stuMap(func);
//定义set
std::set<const Student*,decltype(func)> stuSet(func);
//定义vector,list同理
std::vector< Student*> stuVec{};
//ToDo Add Student...
std::sort(stuVec.begin(), stuVec.end(), [](const Student* left, const Student* right)
{
return left->name < right->name;
});
输出:
完整代码:
int main()
{
typedef struct Student
{
std::string name;
int grade;
} Student;
//Lambda设置map排序规则,同样适合于vector,list
auto func = [](const Student* left, const Student* right)
{
return left->grade < right->grade;
};
//定义map
std::map<const Student*, std::string,decltype(func)> stuMap(func);
//定义set
std::set<const Student*,decltype(func)> stuSet(func);
//测试代码
Student* s1 = new Student{ "s1",12 };
Student* s2 = new Student{ "s2",84 };
Student* s3 = new Student{ "s3",99 };
Student* s4 = new Student{ "s4",33 };
//map
stuMap.emplace(s1,"otherVals1");
stuMap.emplace(s2, "otherVals2");
stuMap.emplace(s3, "otherVals3");
stuMap.emplace(s4, "otherVals4");
std::cout << "map:" << '\n';
for (auto stu : stuMap)
{
std::cout << stu.first->grade << ":" << stu.first->name <<":"<<stu.second<< '\n';
}
std::cout << "-------------------------------------------" << '\n';
//set
stuSet.insert(s1);
stuSet.insert(s2);
stuSet.insert(s3);
stuSet.insert(s4);
std::cout << "set:" << '\n';
for (auto stu : stuSet)
{
std::cout << stu->grade << ":" << stu->name << '\n';
}
std::cout << "-------------------------------------------" << '\n';
delete s1,s2, s3, s4;
system("Pause");
return 0;
}