哈希表 HashMap


简介

在C++中,unordered_map是一个非常有用的数据结构,提供了许多常用的函数来进行插入、删除、查找和遍历操作。下面是一些常用的unordered_map函数的介绍:

  • 插入和删除操作
    insert(key, value): 向unordered_map中插入一个键值对。
    erase(key): 删除unordered_map中指定键的键值对。

  • 查找操作
    find(key): 查找unordered_map中指定键的位置。
    count(key): 返回unordered_map中指定键的出现次数。

  • 容量和大小
    empty(): 检查unordered_map是否为空。
    size(): 返回unordered_map中键值对的数量。

  • 迭代器
    begin(): 返回指向第一个元素的迭代器。
    end(): 返回指向最后一个元素之后位置的迭代器。

  • 其他操作
    clear(): 清空unordered_map中的所有元素。
    bucket_count(): 返回unordered_map中桶的数量。
    load_factor(): 返回当前负载因子的值。


单词规律

题目链接

题目描述:
给定一种规律pattern和一个字符串s,判断s是否遵循相同的规律。
这里的遵循指完全匹配,例如,pattern里的每个字母和字符串s中的每个非空单词之间存在着双向连接的对应规律。

算法描述:
首先,我们需要将字符串s拆分成单词,然后将pattern中的字符与这些单词进行匹配。我们可以使用C++中的stringstreamunordered_map来实现这一点。
接下来,我们可以使用两个unordered_map来分别存储pattern中字符到单词的映射,以及单词到pattern中字符的映射。
最后,我们可以比较这两个映射是否一一对应,如果不对应则返回false,否则返回true。

代码实现:

class Solution {
public:
    bool wordPattern(string pattern, string s) {
        std::unordered_map<char, std::string> charToWord;
        std::unordered_map<std::string, char> wordToChar;
        
        std::stringstream ss(s);
        std::string word;
        int i = 0;
        while (ss >> word) {
            if (i == pattern.length() || 
                (charToWord.count(pattern[i]) == 1 && charToWord[pattern[i]] != word) || 
                (wordToChar.count(word) == 1 && wordToChar[word] != pattern[i])) {
                return false;
            }
            charToWord[pattern[i]] = word;
            wordToChar[word] = pattern[i];
            i++;
        }
        return i == pattern.length();
    }
};

在这段代码中,我们首先创建了两个unordered_map,然后使用stringstream来遍历字符串s中的单词。在遍历的过程中,我们将pattern中的字符与单词进行匹配,并将匹配结果存储在两个unordered_map中。最后,我们比较两个unordered_map中的映射关系是否一一对应,如果是则返回true,否则返回false。

StringStream
StringStream是C++中的一个类,它允许将字符串对象视为流。通过使用StringStream类,我们可以执行从字符串到数值数据类型的提取和插入操作,以及不同类型的解析。这对于将字符串转换为数值数据类型以及反之非常有用。StringStream类还可以用于将字符串分割成单词,并且可以将十进制数转换为十六进制数。以下是一个示例程序,演示了如何使用StringStream类将字符串分割成单词,并将十进制数转换为十六进制数:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

int main() {
    string str("Hello from the dark side");
    string tmp; 
    stringstream str_strm(str);
    vector<string> words; 
    while (str_strm >> tmp) {
        words.push_back(tmp);
    }
    for(int i = 0; i<words.size(); i++)
        cout << words[i] << endl;

    int decimal = 61;
    stringstream my_ss;
    my_ss << hex << decimal;
    string res = my_ss.str();
    cout << "The hexadecimal value of 61 is: " << res;
}

在上面的示例中,我们首先将字符串分割成单词,然后将十进制数转换为十六进制数,并输出结果。

posted @ 2024-01-17 15:37  guanyubo  阅读(7)  评论(0编辑  收藏  举报