哈希表 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++中的stringstream
和unordered_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;
}
在上面的示例中,我们首先将字符串分割成单词,然后将十进制数转换为十六进制数,并输出结果。