【C++】STL(2) -关联容器

C++STL容器内容总结 C++ STL容器使用,原理剖析总结 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ... 阅读详情

1. map

1.1 有序字典

1.1.1 map:有序不可重复key的字典

#include <map>
map< string, float > mp1;   // 空字典
map< string, float> mp2 = {	// 定义时初始化
    {"pen", 20},
    {"pensil", 1.5},
    {"sharpener", 1.5}
};

// 插入:只要item不存在就是插入
mp2.insert( {"eraser", 3.2 } );
mp2.insert( make_pair( "ink", 5 ) );
mp2["paper"] = 1.5;

// 修改:只要item存在就是修改
mp2.insert({"pensil", 1});
mp2.insert(make_pair("pensil", 2));
mp2["pensil"] = 3;
mp2.begin()->second = 1.1;  // 使用迭代器修改

// 删除: 使用key删除
mp2.erase("ink");
// 删除:使用删除项的迭代器删除
auto it = mp2.find("ink");
if(it != mp2.end()){
	mp2.erase(it);    
}

// 遍历1
for( auto mapItem : map1 ){
    cout << mapItem.first << '\t' << mapItem.second << endl;
}
// 遍历2
for(auto it=map1.begin(); it != map1.end(); it++){
    cout << *it << " ";
}

// 查找
auto it = mp2.find("ink");
if( it != mp2.end()){
    cout << "ink found!" << endl;
}

// 获取长度
cout << mp2.size();

// 是否为空
if(mp2.empty()){
    cout << "empty!" << endl;
}

// 指定排序方向
map<string, float, less<string>> mp3;		// 升序,默认
map<string, float, greater<string>> mp4;	// 降序

// 自定义类型时,指定排序方向
struct Greater{
    template<typename T> bool operator()(const T& a, const T& b) const{
        return a > b;
    }
}
map<string, int, Greater>mp;

1.1.2 multimap:有序可重复key的字典

#include <map>
multimap<string, float> mmp1;		// 空字典
multimap<string, float> mmp2 = {	// 定义时初始化
    {"pen", 20},
    {"pensil", 15},
    {"eraser", 3.5}
};

// 插入
mmp2.insert({"ink", 4});
mmp2.insert(make_pair("pen", 18));  // 插入相同key的item
mmp2["ink"] = 5;

// 修改:不能使用[]和insert()方法,只能使用迭代器
auto it = mmp2.find("ink");  // 第一个key=ink的item
it->second = 6;
// 修改:修改所有ink项的值
auto ret = mmp2.equal_range("ink");
for(auto it = ret.first; it != ret.second; it++){
    it->second = 3;
}

// 删除元素:删除所有key=pen的item
mmp2.erase("pen");
// 删除元素:删除第一个key=pen的item
auto it = mmp2.find("pen");
mmp2.erase(it);

// 遍历1
for(auto elem: mmp2){
    cout << elem.first << "\t" << elem.second << endl;
}
// 遍历2
for(auto it=mmp2.begin(); it!=mmp2.end();it++){
    cout << it->first << "\t" << it->second << endl;
}

// 查找:找到第一个找到的item
auto it = mmp2.find("pen");
if( it != mmp2.end()){
    cout << it->first<< "'s price: " << it->second << endl;
}
// 查找:找到所有相同key的item
auto range = mmp2.equal_range("pen");		// 返回pair对象,第一个元素为首个item迭代器,第二个元素为最后一个item的下一个位置上的迭代器
for (auto it = range.first; it != range.second; ++it) {
    cout << "pen's price: " << it->second << endl;
}

// 获取长度
cout << mmp2.size();
// 获取指定item的个数
cout << mmp2.count("pen");

// 是否为空
if(mp2.empty()){
    cout << "empty!" << endl;
}
// 指定排序方向
multimap<string, float, less<string>> mmp3;		// 升序,默认
multimap<string, float, greater<string>> mmp4;	// 降序

// 自定义类型时,指定排序方向
struct Greater{
    template<typename T> bool operator()(const T& a, const T& b) const{
        return a > b;
    }
}
multimap<string, int, Greater> mmp;

1.2 无序字典

1.2.1 unordered_map:无序不可重复key的字典

  • 基本用法和map一致,参考2.1.1。
  • 底层数据结构:哈希表。

1.2.2 unordered_multimap:无序可重复key的字典

  • 基本用法和map一致,参考2.1.2。
  • 底层数据结构:哈希表。

2. set

2.1 有序集合

2.1.1 set:有序不重复元素的集合

#include <set>
set<int> s0 = {2, 1, 3};			// s0={1,2,3}
set<int, less<int>> s1 = {1, 2, 3};	// s={1,2,3}

// 插入操作:如果元素已存在,插入操作被忽略
s1.insert(1);  // 返回pair对象,其第一个值是指向插入项的const_iterator,第二个值是指示插入操作是否成功的bool值。

// 删除
s1.erase(2);
s1.erase(s.begin());

// 查找
auto it = s1.find(3);
if(it!= s1.end()){
    cout << "found!" << endl;
}

// 遍历1
for(auto elem : s1){
    cout << elem << " ";
}
// 遍历2
for(auto it = s1.begin(); it != s1.end(); it++){
    cout << *it << endl;
}

// 是否为空
if(s1.empty()){
    cout << "set is empty!" << endl;
}

// 获取长度
cout << s1.size();

// 指定排序方向
set<int, less<int>> s2 = {1, 2, 3};  // 升序,默认方向
set<int, greater<int>> s3={2,1,3};   // 降序

// 自定义比较函数,创建降序集合
struct Greater{
    template<typename T> bool operator()(const T &a, const T&b){
        return a >= b;
    }
};
set<int, Greater> s1={1,2,3};

2.1.2 multiset:有序可重复元素的集合

#include <set>

multiset<int> ms = {2,3,2,1,4};

// 插入
ms.insert(3);  // 插入已存在的元素
ms.insert(5);  // 插入不存在的元素

// 查找第一个匹配的
ms.find(2);
// 查找所有匹配的
auto ret = ms.equal_range(2);
for(auto it = ret.first; it != ret.second; it++){
    cout << *it << " ";
}
cout << endl;

// 删除所有值为2的元素方法一
ms.erase(2);
// 删除所有值为2的元素方法二
auto ret = ms.euqal_range(2);
for(auto it = ret.first; it != ret.second; it++){
    ms.erase(it);
}
// 删除第一个值为2的元素
auto it = ms.find(2);
ms.erase(it;  			 	 

// 获取长度
cout << ms.size();	

// 是否为空
if(ms.empty()){
    cout << "empty!" <<endl;
}

// 统计元素的个数
cout << ms.count(3) << endl;

2.2 无序集合

2.2.1 unordered_set

  • 基本用法和set一致,参考2.1.1
  • 底层数据结构:哈希表。

2.2.2 unordered_multiset

  • 基本用法和set一致,参考2.1.2
  • 底层数据结构:哈希表。

3 总结

  • 底层数据结构:有序关联容器(set,multiset,map,multimap):红黑树;无序关联容器(unordered_set,unordered_multiset,unordered_map,unordered_multimap):哈希表。

    • 红黑树特点:叶子结点都是空节点,代表查询失败的一种情况;左根右,根叶红,黑路同,不红红;高度上界:h <= 2log(n+1)。
    • 哈希表特点:查询O(1);冲突解决:链表法,开放地址法;buckectAddr=hash(key)。
  • 可重复的关联容器的一些特性

    • 只能使用insert()方法插入。无法使用下标插入,因为无法通过key唯一标识item。
    • 重复项连续地排列,可使用equal_range()方法找到连续的重复项,返回第一项迭代器和最后一项的下一个位置上的迭代器。
    • 可以通过count()方法统计重复项的个数。
  • 有序关联容器的排序方向:元素为基本类型时,指定升序使用less<int>,指定降序使用greater<type>。自定义类型则需要重载运算符"()"。

  • 不可重复的字典:可以使用[],insert()方法和迭代器来修改或者插入item(若item不存在,则操作为插入操作,若item存在,则操作为修改操作)。

  • 可重复的字典:只能使用迭代器修改item。只能使用insert()方法插入item。

  • 支持随机访问的容器(vector,deque等)可以使用 it+i 形式获取迭代器;不支持随机访问的容器(set,map,list等),只能使用 it++ 形式获取迭代器。

  • erase()删除失败(如删除不存在的key)返回0,删除成功返回1。

C++轮子(3) · STL关联容器 我们知道 Concept 表示的不是一个类型而是一个类型集合,所以 Refinement 表示的其实也是一个类型集合,这些类型比 Concept 中的定义的类型要有更多的约束和特性(约束和特性其实是一个问题的两个方面,你约束的越是严格,你能够使用的特性越多,但是你能使用的场景越少,比如 Java 中 Object 类哪儿都能用,又哪儿都用不了)。如果你在你的程序中需要查找最吻合的某个值(比如上面例子中的找到给定分辨率最合适的比特率),你可以使用上面提到的这几个函数,它们可以在logn之内找到给定的位置。 阅读详情

相关推荐

一篇搞懂C++ STL 关联容器std::set

C++ 标准模板库(STL)提供了多种容器类,用于高效地处理各种数据。std::set是 STL 中的一种关联容器,用于存储唯一的有序元素。它利用平衡二叉树结构(如红黑树)来实现高效的元素查找、插入和删除操作。本文将详细介绍std::set的构造函数、成员函数、以及如何使用它。我们还将解释什么是关联容器,并提供示例代码以演示std::set的用法。关联容器是 STL 中的一类容器,它们通过某种数据结构(通常是平衡树)来实现高效的元素查找、插入和删除。与顺序容器(如和std::deque。

m0_62599305的博客 1703

c++ STL算法与应用(一) 字典序列与全排列

       在数据结构中,所谓的字典序列其实很简单;就是元素根据英文字母的顺序排列,就叫字典序列;比列{a,b,c}就是一个字典序列;         对于集合在数据结构中我们用std::set来管理和使用它,需要注意的是集合中不能有相同元素,就和高数一样的。所以std::set中的元素必须有"&lt;"的重载或者能够比较大小的函数对象。          比如像{1,2,3,4}这样的一个...

wanghualin033的博客 1015

C++ | STL之顺序容器、关联容器、容器适配器

文章目录STL简述STL六大组件顺序容器(序列式容器)vectordequelist关联容器容器适配器 STL简述 STL是Standard Template Library的简称,中文名标准模板库,从根本上说,STL是一些“容器”的集合,这些“容器”有list、vector、set、map等,STL也是算法和其他一些组件的集合。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。...

ZY-JIMMY 2377

C++ STL常用标准库容器入门(vector,map,set,string,list...)

其中几种种序列容器类型 C++ STL中最基本以及最常用的类或容器无非就是以下几个: string vector deque list forward_list queue priority_queue stack string 对比在C语言中一般怎么使用字符串的 char* s1 = "Hello JackYu!"; //创建指针指向字符串常量,既然是常量字符串,这段字符...

yuleidnf的博客 2万+

基于STL的简易字典

c++语言,基于STL的字典程序,通过IO流读取文件中的已有数据进行查询。数据格式为:单词 中文 词性

企业级AI Agent平台建设方案

本报告将深入剖析构成一个顶级AI Agent平台的各个功能层面,为构建者提供一份全面的战略蓝图。

分享AI和大数据领域的知识和研究 1582

STL——字典 map EOF char*

Description 输入n个字符串对(str1,str2),再输入k个查询字符串str,从字符串对中查找查询字符串,即如果str=str2,则输出str1,如果查询不到则输出”eh”(不包含引号)。输入保证所有字符串对的str2不相同,字符串只含有字母和数字,长度小于20! Input 输入包含多组数据,直到文件结尾。 每组数据第一行包含一个整数n(0≤n≤10^5)。接下来n行,每行...

fighting123678的博客 1786

使用Dify打造视频生成工作流:从提示词到视频的完整指南

Dify作为开源LLM应用开发平台,通过可视化工作流编排实现从文本到视频的端到端生成,将创意周期从天级缩短至分钟级。核心流程包括提示词工程、视频API调用、存储分发和结果反馈。

牛奶夹心巧克力 3435

C++ STL专题解题安迪的字典

Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy task for him, as the number of words that he knows is, well, not quite enough. Instead of thinking up all the wo...

qq_43656233的博客 358

MySQL 分库分表及其平滑扩容方案

MyCAT不仅仅可以用作读写分离,以及分表分库、容灾管理,而且可以用于多租户应用开发、云平台基础设施,让你的架构具备很强的适应性和灵活性。分表对于一张多行(记录)多列(字段)的二维数据表,又分两种情形(1)垂直分表竖向切分,不同分表存储不同的字段,可以把不常用或者大容量、或者不同业务的字段拆分出去;扩容前每个节点的数据,有一半要迁移至一个新增节点中,对应关系比较简单。此时,四个节点的数据都已完整,只是有冗余(多存了和自己配对的节点的那部分数据),择机清除即可(过后随时进行,不影响业务)。...

m0_71777195的博客 1929

ALSA音频开发实战:如何用snd_pcm_avail避免缓冲区溢出(附完整代码)

本文深入探讨了在ALSA音频开发中,如何利用`snd_pcm_avail`函数有效管理环形缓冲区,从而避免音频数据溢出或下溢。通过实战代码示例,详细解析了该函数在播放场景下的核心作用,即实时查询可写入的帧数,并构建了自适应写入循环以实现稳健的流量控制,确保音频流的平滑与稳定。

weixin_29183637的博客 461

数据结构学习笔记-2.2:C++ STL 容器、关联容器、容器适配器

⚪ 本文内容主要讲解C++ STL容器在竞赛中的使用 ⚪ 本文参考资料:Cppreference (受支持的C++规范均已标明) array` (C++11) std::array 是 STL 提供的 内存连续的 、 固定长度 的数组数据结构。其本质是对原生数组的直接封装。 为什么要用 array array 实际上是 STL 对数组的封装。它相比 vector 牺牲了动态扩容的特性,但是换来了与原生数组几乎一致的性能(在开满优化的前提下)。因此如果能使用 C++11 特性的情况下,能够使用原生数组的地

HeartFireY的博客 621

【系统架构设计师-2026上半年真题】综合知识-参考答案及详解(75题完全回忆版)

【系统架构设计师-2026上半年真题】综合知识-参考答案及详解(75题完全回忆版)

数据知道的博客 3102

cb26a_c++_STL_算法_元素计数

cb26a_c++_STL_算法_元素计数 所有容器都可以使用 count count_if 关联容器的等效成员函数,容器自己的成员函数速度较快 1.set.count 2.multiset.count 3.map.count 4.multimap.count error C2275: “std::greater<int>”: 将此类型用作表达式非法 少了括号:std::greate...

Txwtech 471

【C++】构造函数之初始化列表(Initialization list of constructors)

本讲主要是构造函数的初始化列表的讲节,但是本节很重要,可以关乎后面写项目

m0_62599305的博客 2234

Ubuntu Rtx3090 Cuda11.7 安装 pytorch3d

pytorch ubuntu pytorch3d 安装

G果的博客 2273

Catch2容器测试:STL容器验证

在日常C++开发中,STL(Standard Template Library)容器是我们最常用的数据结构。然而,传统的断言方式往往显得笨拙且难以维护: ```cpp // 传统方式 - 繁琐且容易出错 REQUIRE(vector.size() == expected_size); for (size_t i = 0; i < vector.size(); ++i) { REQUIRE...

gitblog_00485的博客 945

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++STL学习第二讲下(从源代码角度讲解STL)

C++STL学习第二讲下(从源代码角度讲解STL)

weixin_41736570的博客 742

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

终极指南:C++ STL容器迭代器失效的7大原因与避免方法

C++ STL(Standard Template Library)容器是C++编程中不可或缺的工具,但迭代器失效问题常常困扰开发者。本文将深入解析导致迭代器失效的7大核心原因,并提供实用的避免方法,帮助你写出更健壮的C++代码。 ## 一、容器内存重新分配导致的失效 ⚠️ **原因分析**:当vector、string等动态数组容器的大小超过其当前容量(capacity)时,会触发内存重新分

gitblog_00430的博客 543

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c++之STL(11) 算法- 元素计数

count count_if 关联容器的等效成员函数: set.count multiset.count map.count multimap.count

taotaoahui 737

c++之STL详解

万字长文带你深度了解c++STL

ltzoro的博客 7546

【C++】关联容器

介绍了关联容器中的map、set、multimap和multiset

dab112的博客 2249

C++ STL(四)关联容器

std::multimap 是 C++ 标准模板库(STL)中的一个关联容器,用于存储键值对(key-value pairs),并按照键的顺序自动排序。std::multiset 的迭代器是一个双向迭代器,支持 ++ 和 -- 操作。std::set 的迭代器是一个双向迭代器,支持 ++ 和 -- 操作。与std::set 不同std::multiset允许存储重复的元素。std::set 的迭代器是一个双向迭代器,支持 ++ 和 -- 操作。:std::map 中的键是唯一的,不允许重复。

dingyahui的博客 1312

C++中STL容器总结

STL容器1、容器分类 1、容器分类 STL中通常将容器分为三类:顺序容器、关联容器和容器适配器。 1、顺序容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。 顺序容器包括: vector(向量)、list(列表)、deque(队列)...

EricLee23 2363

【STL八】关联容器

关联式容器存储的元素,都是一个一个的“键值对”。

junxuezheng的博客 1214
上一篇: 【C++】STL(1) - 序列容器
下一篇: 【C++】STL(3) - 容器适配器
南隅。
博客等级 码龄8年 279粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值