std::unordered_map与std::unordered_multimap示例代码

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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值