首页 > 编程语言 >C++常用的无序的关联容器

C++常用的无序的关联容器

时间:2023-12-28 22:00:49浏览次数:192  
标签:容器 哈希 map 无序 C++ key insert include unordered

常用的无序关联容器

在实际问题场景中,除了常见的线性表结构,字符串,排序操作之外,散列表和红黑树也是非常常见的,有很多应用场景都会用到它们。

  • 散列表虽然比较占空间,但是它的增删查的都很快,趋近于O(1);
  • 红黑树也是一颗二叉排序树,所以入红黑树的数据都是经过排序的,它的增删查时间复杂度都是O(C++常用的无序的关联容器_散列表) ,对数时间,比哈希表慢

但是如果问题场景对数据的有序性有所要求,而且增删查的操作都比较多,那么就适合用红黑树结构,哈希表里面的数据是无序的。

链式哈希表作为底层数据结构无序关联容器有:
unordered_set、unordered_multiset、unordered_map、unordered_multimap,对比如下:

容器名称

存储内容

备注

常用方法

unordered_set

只存储key

不允许key重复

insert(key), erase(key), find(key)

unordered_multiset

只存储key

允许key重复

insert(key), erase(key), find(key)

unordered_map

存储key,value对

不允许key重复

insert({key,value}), erase(key), find(key)

unordered_multimap

存储key,value对

允许key重复

insert({key,value}), erase(key), find(key)

set只存储key,底层是哈希表,经常用来大数据查重复值或者去重复值;

map存储key,value对,经常用来做哈希统计,统计大数据中数据的重复次数,当然它们的应用很广,不仅仅用在海量数据处理问题场景中。

C++常用的无序的关联容器_STL无序关联容器_02


C++常用的无序的关联容器_STL无序关联容器_03

下列代码以unordered_set和unordered_map做一些代码演示

#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;

int main(){
	// 不允许key重复 改成unordered_multiset自行测试
	unordered_set<int> set1; 
	for (int i = 0; i < 100; ++i){
		set1.insert(rand()%100+1);
	}
	cout << set1.size() << endl;

	// 寻找是否存在20并删除
	auto it1 = set1.find(20);
	if (it1 != set1.end()){
		set1.erase(it1);
	}

	// count返回set中有几个50=》最多是1个
	cout << set1.count(50) << endl;
	return 0;
}

C++常用的无序的关联容器_STL无序关联容器_04


C++常用的无序的关联容器_unordered_set/map_05

#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;

int main(){
	// 定义一个无序映射表
	unordered_map<int, string> map;
	// 无序映射表三种添加[key,value]的方式
	map.insert({ 1000, "aaa" });
	map.insert(make_pair(1001, "bbb"));
	map[1002] = "ccc";

	// 遍历map表1
	auto it = map.begin();
	for (; it != map.end(); ++it){
		cout << "key:" << it->first << " value:" << it->second << endl;
	}
  
	// 遍历map表2
	for (pair<int, string> &pair : map){
		cout << "key:" << pair.first << " value:" << pair.second << endl;
	}

	// 查找key为1000的键值对,并且删除
	auto it1 = map.find(1000);
	if (it1 != map.end()){
		map.erase(it1);
	}

	return 0;
}

#include <iostream>
#include <string>
#include <unordered_map>
int main(){
	std::unordered_map<std::string, std::string> mymap =
    {
		{ "house", "maison" },
		{ "apple", "pomme" },
		{ "tree", "arbre" },
		{ "book", "livre" },
		{ "door", "porte" },
		{ "grapefruit", "pamplemousse" }
	};
    
	unsigned n = mymap.bucket_count(); //获取哈希桶的个数
	std::cout << "mymap has " << n << " buckets.\n";
    
	for (unsigned i = 0; i < n; ++i) {
    // 逐个遍历哈希桶中的链表
		std::cout << "bucket #" << i << " contains: ";
		for (auto it = mymap.begin(i); it != mymap.end(i); ++it)
			std::cout << "[" << it->first << ":" << it->second << "] ";
		std::cout << "\n";
	}

	return 0;
}

标签:容器,哈希,map,无序,C++,key,insert,include,unordered
From: https://blog.51cto.com/u_15172160/9018898

相关文章

  • C++ Qt开发:Qt的安装与配置
    Qt是一种C++编程框架,用于构建图形用户界面(GUI)应用程序和嵌入式系统。Qt由Qt公司(前身为Nokia)开发,提供了一套跨平台的工具和类库,使开发者能够轻松地创建高效、美观、可扩展的应用程序。其被广泛用于开发桌面应用程序、嵌入式系统、移动应用程序等。无论是初学者还是经验丰富的开发者,Q......
  • C++ Qt开发:SqlTableModel映射组件应用
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlTableModule组件的常用方法及灵活运用。在多数情况下我们需要使用SQL的方法来维护数据库,但此......
  • Thrift C++
    一、引子Thriftisaninterfacedefinitionlanguageandbinarycommunicationprotocolthatisusedtodefineandcreateservicesfornumerouslanguages.Thrift是用于...(使用接口定义语言和二进制通信协议定义并创建跨语言服务)的框架,允许开发者在不同的编程语言之间......
  • 【C++】使用指针,动态多维数组
    二维数组intm=3,n=2;int**arr;//动态创建二维数组[3][2]arr=newint*[m];//这里是mfor(inti=0;i<m;i++){ arr[i]=newint[n];//这里是n}三维数组intx=3,y=4,z=5;//arr[3][4][5]int***arr;arr=newint**[x];for(inti=0;i<x;i++){......
  • [C++ 从入门到精通] 17.基类与派生类关系的详细再探讨
    文章预览:一.派生类对象模型简述二.派生类构造函数三.既当父类又当子类(多继承)四.不想当基类的类final五.静态类型与动态类型六.派生类向基类的隐式类型转换七.父类子类之间的拷贝与赋值一.派生类对象模型简述若一个类,继承自一个父类(基类),那么该类称之为子类(派生类)。并且该......
  • [C++ 从入门到精通] 18.左值、右值,左值引用、右值引用、move
    文章预览:一.左值和右值二.引用分类三.左值引用(1个地址符&)四.右值引用(2个地址符&)五.std::move函数一.左值和右值inti;//赋值语句i=20;//左值:i(int类型的对象,代表一块内存区域),右值:20(代表一个值)左值(左值表达式):能用在赋值语句等号左侧的东西,就称之为左值。它能够代表一个......
  • [C++ 从入门到精通] 16.RTTI、dynamic_cast、typeid、虚函数表
    文章预览:一.RTTI是什么二.dynamic_cast类型(指针/引用)转换2.1C风格的强制类型转换2.2指针转换(常见用法)2.3引用转换三.typeid运算符四.type_info类五.RTTI与虚函数表一.RTTI是什么RTTI(Run-TimeTypeIdentification):通过运行时类型信息,程序能够使用基类的指针或引用来检查......
  • [C++ 从入门到精通] 15.友元函数、友元类、友元成员函数
    文章预览:一.前言二.友元函数三.友元类四.友元成员函数一.前言众所周知,C++控制对类对象私有成员的访问。通常,公有类方法(public)提供唯一的访问途径,但是有时候这种限制太严格,以至于不适合特定的编程问题。在这种情况下,C++提供了另外一种形式的访问权限:友元,友元有3种:友元函数;友......
  • 人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码 可实时检测OpenCV库使
    人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码可实时检测目录人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码可实时检测1.项目介绍2.人体关键点检测方法(1)Top-Down(自上而下)方法(2)Bottom-Up(自下而上)方法:3.人体关键点检测模型(1)人体关键点检测......
  • 一键抠图2:C/C++实现人像抠图 (Portrait Matting)OpenCV库使用opencv-4.3.0版本,opencv_
    一键抠图2:C/C++实现人像抠图(PortraitMatting)目录一键抠图2:C/C++实现人像抠图(PortraitMatting)1.前言2.抠图算法3.人像抠图算法MODNet(1)模型训练(2)将Pytorch模型转换ONNX模型(3)将ONNX模型转换为TNN模型4.模型C++部署(1)项目结构(2)配置开发环境(OpenCV+OpenCL+base-utils+TNN)(3)......