自定义STL map排序:按照姓名长度排序

需积分: 31 1 下载量 106 浏览量 更新于2024-09-12 收藏 48KB DOCX 举报
"这篇文档主要讨论了如何在STL(标准模板库)中自定义排序准则,特别是针对set和map容器。通过创建自定义结构体并重载`<`运算符,可以改变元素的默认排序方式。文中给出了一个示例,展示了如何根据学生对象的不同属性(如学号、身高或姓名)进行排序。" 在STL中,`set`和`map`容器会根据元素的键值自动进行排序。通常,它们使用`<`运算符来比较元素,决定排序顺序。但是,如果默认的排序方式不能满足需求,我们可以自定义排序准则。这里提供了三种方法来修改`map`的排序准则: **方法1:采用结构体方法修改map的准则** 首先,我们创建一个名为`stu`的结构体,包含三个成员变量:`num`(学号)、`height`(身高)和`name`(姓名)。为了实现自定义排序,我们需要重载结构体的`<`运算符。 例如,如果我们要按照学号`num`进行排序,我们可以这样重载`<`运算符: ```cpp bool operator<(const stu& src) const { return this->num < src.num; } ``` 若要按身高`height`排序,重载如下: ```cpp bool operator<(const stu& src) const { return this->height < src.height; } ``` 而如果要按照姓名的长度进行排序,我们可以这样做: ```cpp bool operator<(const stu& src) const { return (this->name).size() < (src.name).size(); } ``` 如果需要按照姓名的字典顺序排序,重载如下: ```cpp bool operator<(const stu& src) const { return this->name < src.name; } ``` 接下来,我们可以创建一个`map<stu, int>`类型的实例,并插入一些`stu`对象。通过迭代遍历`map`,可以看到元素已经按照我们指定的排序准则排列。 ```cpp map<stu, int> stumap; // 插入元素 stumap.insert(make_pair(kk1, 20)); stumap.insert(pair<stu, int>(kk2, 21)); stumap.insert(make_pair(kk3, 22)); // 遍历并打印map,展示排序结果 for (pos = stumap.begin(); pos != stumap.end(); ++pos) { cout << "Name: " << pos->first.name << ", Height: " << pos->first.height << ", Num: " << pos->first.num << endl; } ``` 以上就是如何在STL中修改`map`的排序准则的方法。通过这种方式,我们可以根据实际需求灵活地调整元素的排序规则,不仅限于数值或字符串的比较,还可以扩展到更复杂的自定义类型。这种方法对于STL编程来说非常实用,特别是在处理自定义数据结构时。