class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
map<string,vector<string>>mp;
for(string&s: strs){
string sorted_s=s;
ranges::sort(sorted_s);
mp[sorted_s].push_back(s);
}
vector<vector<string>>ans;
ans.reserve(mp.size());
for(const auto& [_,value]:mp){
ans.push_back(value);
}
return ans;
}
};
温故:map的用法
map[key value],键是独一无二的(默认升序),找值只能通过键来查找
应用场景
1.统计频率:
可以用键表示元素,值表示该元素的频率。例如,统计字符出现的次数。
2.分组:
可以用键表示分组的标识符,值表示分组的内容。例如,将字符串按字母异位词分组。
3.映射关系:
可以用键表示唯一标识符,值表示与之关联的数据。例如,将用户ID映射到用户名。
新知识1:
ranges::sort
是 C++20 引入的一个新特性,属于 C++20 的 Ranges 库。它提供了一种更简洁和通用的方式来对范围(如数组、向量、字符串等)进行排序。ranges::sort
是对传统 std::sort
的扩展,支持更多的用法和更灵活的语法。
与 std::sort
的区别
-
std::sort
:-
需要显式指定迭代器范围,例如
std::sort(vec.begin(), vec.end());
-
语法较为繁琐,尤其是在处理复杂范围时。
-
-
ranges::sort
:-
直接作用于范围,无需显式指定迭代器范围。
-
支持更多类型的范围,包括数组、向量、字符串等。
-
语法更简洁,更易于使用。
-
自定义比较函数
ranges::sort
也支持自定义比较函数,与std::sort
类似。例如,按降序排序:cpp复制
#include <iostream> #include <ranges> #include <vector> int main() { std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6}; std::ranges::sort(vec, std::greater<int>()); for (int num : vec) { std::cout << num << " "; // 输出: "9 6 5 4 3 2 1 1" } std::cout << std::endl; return 0; }
6. 优势
-
简洁性:
ranges::sort
的语法更简洁,减少了代码量。 -
通用性:支持更多类型的范围,包括数组、向量、字符串等。
-
易用性:直接作用于范围,无需显式指定迭代器范围。
-
、
-
新知识2:
for (const auto& [key, value] : myMap) {
std::cout << key << ": " << value << std::endl;
}
1. for (const auto& [key, value] : myMap)
-
const auto&
:表示循环变量是myMap
中每个元素的引用,且为const
,这意味着在循环中不能修改myMap
中的元素。 -
[key, value]
:这是C++17引入的结构化绑定(Structured Binding)特性,它允许将std::pair
(std::map
中的每个元素是一个std::pair
,包含键和值)直接解构为两个变量key
和value
。 -
myMap
:这是一个std::map
或std::unordered_map
类型的容器。
新知识3
使用reverse函数开辟合理大小的空间,防止vector数组重复扩容浪费资源