Loading

C++关联容器

关联容器的定义#

在应用场景下如何选择容器:顺序容器 or 关联容器?
从容器的存储结构分析:关联容器中的元素是按 关键字 来保存和访问的,而顺序容器中的元素按它们在容器中的位置来顺序保存和访问的。

关联容器的分类#

关联容器按关键字有序保存元素:

容器名称 头文件 备注
map #include <map> 关联数组:保存 键值对
set #include <set> 关键字就是其值,即只保存关键字的容器
multimap #include <map> 和map的区别:关键字可重复出现
mutilset #include <set> 和set的区别:关键字可重复出现

关联容器按关键字无序保存元素:

容器名称 头文件 备注
unordered_map #include <unordered_map> 用哈希函数组织的map
unordered_set #include <unordered_set> 用哈希函数组织的set
unordered_multimap #include <unordered_map> 和unordered_map的区别:关键字可重复出现
unordered_mutilset #include <unordered_set> 和unordered_set的区别:关键字可重复出现

频繁使用的关联容器:mapset
一个 mapset 中的关键字必须是唯一的,即对于一个给定的关键字,只能有一个元素的关键字等于它。

关联容器的操作#

map#

map的元素是pair,故操作对象是pair。
可以修改map中元素的值,但不能修改元素的键。

/*
 * @Description: 
 * @Author: 
 * @version: 
 * @Date: 2023-07-07 14:50:34
 * @LastEditors: 
 * @LastEditTime: 2023-10-07 17:12:19
 */
#include <iostream>
#include <map>
#include <string>

using namespace std;

/*
 * map容器保存的都是键值对:<key>:<val>,且键的名称在map中不能出现重复,
 * 但值的名称没有这个要求。map容器中会自动根据键对所有的键值对进行排序。
*/

void print_map(map<string, string> mp)
{
    map<string, string>::iterator it;
    for (it = mp.begin(); it != mp.end(); it++)
    {   
        cout << it->first << ": " << it->second << endl;
    }
}

int main()
{
    map<string, string> book_person = {
        {"《三国演义》", "诸葛亮"},
        {"《史记》", "司马迁"}
        };  // 定义map容器,并列表初始化(c++11)
    map<string, string>::iterator it; // 定义map容器的迭代器

    // 插入数据(3种不同的插入方式)
    book_person.insert(pair<string, string>("《西游记》", "孙悟空"));
    book_person.insert(map<string, string>::value_type("《水浒传》", "鲁智深"));
    book_person["《红楼梦》"] = "贾宝玉";
    // 迭代器遍历map
    cout << "迭代器遍历map:" << endl;
    print_map(book_person);

    // 查找并获取元素
    it = book_person.find("《西游记》");
    if (it != book_person.end())
        cout << "\nkey 《西游记》 find, the value is " << it->second << endl;
    else
        cout << "\n《西游记》 not find " << endl;
    
    // 删除元素(map中关键字不能重复,若删除成功,删除数量只有1个)
    int num = book_person.erase("《史记》");
    if (num == 1)
        cout << "《史记》删除成功\n" << endl;
    print_map(book_person);

    return 0;
}

📌 观察下图,键值对的插入map顺序:{"《三国演义》", "诸葛亮"}, {"《史记》", "司马迁"}, {"《西游记》", "孙悟空"}, {"《水浒传》", "鲁智深"}, {"《红楼梦》", "贾宝玉"},但是map打印输出时却不是按照插入顺序打印的

set#

/*
 * @Description: 
 * @Author: 
 * @version: 
 * @Date: 2023-07-04 14:23:19
 * @LastEditors: 
 * @LastEditTime: 2023-10-07 17:32:30
 */
#include <iostream>
#include <set>

using namespace std;

/*
 * set容器保存的都是键:<key>:,且键的名称在map中不能出现重复,
 * set容器中会自动根据键对所有的键进行排序。
*/

void print_set(set<string> st)
{
    set<string>::iterator it;
    for (it = st.begin(); it != st.end(); it++)
    {   
        cout << *it << " ";
    }
    cout << endl;
}

int main()
{
    set<string> person = {
        "孙悟空",
        "林黛玉",
        "宋江"
    }; // 定义set,并列表初始化
    set<string>::iterator it;

    // 插入元素
    person.insert("刘玄德"); 
   
    // 迭代器遍历set
    cout << "迭代器遍历set: ";
    print_set(person);

    // 查找元素
    it = person.find("宋江");
    if (it != person.end())
        cout << "\n宋江 find" << endl;
    else
        cout << "\n宋江 not find" << endl;

    // 删除元素
    int num = person.erase("孙悟空");
    if (num == 1)
        cout << "孙悟空 删除" << endl;
    else
        cout << "孙悟空不在set中" << endl;
    print_set(person);

    return 0;
}

作者:caojun97

出处:https://www.cnblogs.com/caojun97/p/17746300.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   eiSouthBoy  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
历史上的今天:
2022-10-11 MQTT协议的消息保留标志位:retained
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu