C++容器概述

C++容器概述

C++STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

STL六大组件的交互关系:
1、容器通过空间配置器取得数据存储空间
2、算法通过迭代器存储空间的内容
3、仿函数可以协助算法完成不同策略的变化
4、适配器可以修饰仿函数

容器:就是各种数据结构,如vector、list、deque、set、map等,用于存放数据,从实现的角度来看,STL容器是一种模板类。

1、顺序容器

定义: 在容器内部,元素的摆放是有顺序的。
在这里插入图片描述

2、关联容器

定义: 关联容器不计较顺序的概念,使用关键字来访问元素。

标准的STL关联容器分为set(集合)和map(映射)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表)。这些容器的底层机制均以RB-tree完成(红黑树)。

①map操作

map只允许产生一对一的关系,也就是一个关键字对应一个值,就如生活中大多数人,一人一套房。但是也有人是名下多套房,这就可以使用multimap,它允许一个关键字对应多个值。

a.添加

不允许key有重复的

	address_map.insert({"张三" , "星湖花园1号"});
	address_map.insert(make_pair("李四" , "星湖花园1号"));
	address_map.insert(pair<string ,string>("王五" , "星湖花园1号"));

b.访问

map可以使用[ ]的方式来获取指定的元素,要求传递进来的是key关键字

	string address = address_map["张三"] ;
	string address2 = address_map.at("张三2")

c.删除

除了可以使用迭代器的方式删除外,还可以根据关键字来删除数据

    //迭代器方式删除。
    for(auto i = address_map.begin() ; i != address_map.end() ; i++){
        if(i->first == "李四"){
            address_map.erase(i);
        }
    }

    //使用关键字删除
    address_map.erase("王五");

    //清空整个map
    address_map.clear();

d.修改

修改其实就是替换,如果还是使用insert是不起作用的,因为它会执行唯一检查,使用at函数,对某一个特定关键字的位置修改值

	map.at("张三1") = 99;

其他操作

判断是否为空、获取大小、判断是否存在key

    //判断是否为空
    bool empty = map.empty();
    
    //获取大小
    int size = map.size();
    
    //查询该key在map中的个数,可用来判断是否存在该key
    int count = map.count("张三1");

2、set操作

set是关键字的简单集合,并且容器内部元素不可重复且有顺序。当只是想知道一个值是否存在时,set是最有用的。set为不可重复容器,而multiset为可重复容器

a.添加

    //创建容器并初始化,可变参数往里面赋值,但是这里添加了重复的3. 后面的3不会被添加进去。
    set<int> s1{3,4,5,6,3};
    s.insert(16);
    s.insert({7,8,9,10}); //也可以接收可变参数
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中的代码展示了如何在C++中使用vector嵌套vector的方式创建一个二维数组。通过定义一个存放vector的vector,可以实现容器的嵌套。通过使用迭代器进行遍历,可以访问内层的vector中的元素。 引用中的代码展示了一个修改后的例子,解决了在循环中报越界错误的问题。在初始化距离列表dist时,先为每个外层的vector添加一个内层的vector,再在内层的vector中添加元素。 引用中的代码展示了一个报错的例子,原因是在初始化距离列表dist时,没有为每个外层的vector添加一个内层的vector,直接访问dist[i]导致越界错误。 因此,如果想在C++中使用vector双重嵌套,需要注意在初始化时为每个外层的vector添加一个内层的vector,然后再向内层的vector中添加元素。这样可以有效避免越界错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c++迭代器STL中的vector简单概述](https://blog.csdn.net/weixin_52668597/article/details/126922278)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++初始化双层vector(vector<vector<double>>)出现Expression: vector subscript out of range错误...](https://blog.csdn.net/weixin_48609829/article/details/121033126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值