Bootstrap

49字母异位词分组

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::pairstd::map中的每个元素是一个std::pair,包含键和值)直接解构为两个变量keyvalue

  • myMap:这是一个std::mapstd::unordered_map类型的容器。

新知识3

使用reverse函数开辟合理大小的空间,防止vector数组重复扩容浪费资源

;