unordered_map
是关联容器,含有带唯一键的键-值pair 。搜索、插入和元素移除拥有平均常数时间复杂度。元素在内部不以任何特定顺序排序,而是组织进桶中。元素放进哪个桶完全依赖于其键的哈希。这允许对单独元素的快速访问,因为一旦计算哈希,则它准确指代元素所放进的桶。
unordered_multimap
是无序关联容器,支持多个相同键值(一个unordered_multimap
可含有一个键值的多个副本)。
示例代码如下:
#include <algorithm>
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
int main(int, char **) {
constexpr int FILTER_NUM = 2;
std::vector<int> data = {1, 2, 5, 7, 10, 2, 7, 20, -3, -9, 7, -9};
// Step 1: build the data map.
// method 1
std::unordered_multimap<int, int> count_map;
for (size_t i = 0; i < data.size(); ++i) {
count_map.emplace(data[i], i);
}
// method 2
std::unordered_map<int, int> count_map1;
for (size_t i = 0; i < data.size(); ++i) {
if (count_map1.count(data[i]) == 0) {
count_map1.emplace(data[i], 1);
} else {
++count_map1[data[i]];
}
}
// Step 2: retrieve the results.
// method 1
std::unordered_set<int> result;
for (size_t i = 0; i < data.size(); ++i) {
if (count_map.count(data[i]) >= FILTER_NUM) {
result.emplace(data[i]);
}
}
// method 2
std::vector<int> result1;
for (size_t i = 0; i < data.size(); ++i) {
if (count_map1[data[i]] >= FILTER_NUM &&
std::find(result1.begin(), result1.end(), data[i]) == result1.end()) {
result1.emplace_back(data[i]);
}
}
// Step 3: show the results.
std::cout << "Result is: " << std::endl;
for (const auto &element : result) {
std::cout << element << ", ";
}
std::cout << std::endl;
std::cout << "Result1 is: " << std::endl;
for (const auto &element : result1) {
std::cout << element << ", ";
}
std::cout << std::endl;
return 0;
}
CMake编译脚本文件CMakeLists.txt
为:
cmake_minimum_required(VERSION 3.0.0)
project(multi_map VERSION 0.1.0)
include(CTest)
enable_testing()
add_executable(multi_map main.cpp)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
运行结果如下:
Result is:
-9, 7, 2,
Result1 is:
2, 7, -9,