C++中容器的分类以及相关用法

  • C++中的容器类型及使用
    • 容器的分类
    • array 数组
    • vector 向量
    • list 列表
    • deque队列
    • 关联容器
    • 迭代器

C++中的容器类型及使用

容器的概念:
  泛型编程是一种编程理念,其提出的动机是发明一种语言机制,能够在编程中编写完全一般化的可重复使用的算法,不会因为数据类型的不同而有差异。
  美国的惠普实验室针对泛型编程开发了一系列软件工具,被称为标准模板库(STL),后续在C++中被广泛引入。STL中绝大多数的类型都使用了模板的编程技术,这相比传统的代码而言有更好重用特性。
  在STL中最核心的内容是容器和迭代器
  容器指的是用来存储数据的集合,由于内部存储的数据使用模板实现,因此可以支持绝大多数数据类型。迭代器是配合容器进行高效遍历的工具,是一种特殊的指针。

容器的分类

首先容器分为:顺序容器和关联容器
  顺序容器中有:string字符串array数组(C++11引入)vector向量list列表deque队列
  特点: 顺序容器是一种各元素之间有顺序关系的结构集合,每个元素在容器都有固定的位置,但是可以用删除或插入等操作改变这个位置。
  关联容器中有:map键值对映射multimap多重键值对映射
  特点:关联容器的各元素之间没有严格的物理上顺序关系;但是内部有排序,因此可以用迭代器遍历;关联容器内部的元素以键值对key-value pair的形式存在。
  使用注意:容器类的使用需要引入头文件,所有的容器类都是属于std名

#include <array>
#include <vector>
#include <list>
#include <map>
#include <deque>

array 数组

  特点:array是C++ 11中引入的容器类型,与传统数组相比,array更加安全和易于使用

#include <iostream>
#include <array> // 引入头文件
using namespace std;
int main()
{// 创建一个长度为5的int数组array<int,5> arr = {2,4,6,8,10};cout << arr[0] << endl; // 2cout << arr[4] << endl; // 10arr[1] = 666;cout << arr.at(1) << endl; // 666// 普通循环for(int i=0;i<arr.size();i++){cout << arr.at(i) << " ";}cout << endl;// 给所有元素赋值arr.fill(5);// for-each循环for(int i:arr){cout << i << " ";}cout << endl;// 迭代器:略return 0;
}

vector 向量

  特点:vector内部由数组实现,因此可以高效地进行元素的随机存取,但是插入和删除的效率较低,是最常用的一种顺序容器。
  示例:

#include <iostream>
#include <vector> // 引入头文件
using namespace std;
int main()
{// 创建一个长度为0的向量对象vector<int> vec1;cout << vec1.empty() << endl; // 1// 创建一个长度为5的向量对象vector<int> vec2(5);vec2[0] = 123; // 修改元素cout << vec2[0] << endl; // 123cout << vec2.at(4) << endl; // 0// 5个666vector<int> vec3(5,666);// 向后追加元素vec3.push_back(888);// 在第二个位置插入2// 参数1:插入的位置// 参数2:插入的元素vec3.insert(vec3.begin()+1,2);// 在倒数第二个位置插入222vec3.insert(vec3.end()-1,222);// 删除第一个元素vec3.erase(vec3.begin());// 删除最后一个元素vec3.erase(vec3.end()-1);vec3.pop_back(); // 删除最后一个元素// 普通循环遍历for(int i=0;i<vec3.size();i++){cout << vec3.at(i) << " ";}cout << endl;// 清空vec3.clear();// for-each遍历for(int i:vec3){cout << i << " ";}cout << endl;// 迭代器遍历:略return 0;
}

list 列表

  特点:list内部由双向链表实现,因此元素的内存空间是不连续的,能高效地进行插入和删除操作,但是随机存取的效率较低,并且list只能通过迭代器指针来访问数据。总结:能高效的进行插入删除操作;随机存取效率较低。
  示例:

#include <iostream>
#include <list> // 引入头文件
using namespace std;
int main()
{// 创空list<string> lis2;// 判空cout << lis2.empty() << endl;// 创建一个四个hello元素的列表对象list<string> lis1(4, "hello");// 向后追加元素lis1.push_back("bye");// 向前追加元素lis1.push_front("start");// 取出头部元素cout << lis1.front() << endl;// 取出尾部元素cout << lis1.back() << endl;// 删除头部元素lis1.pop_front();// 删除尾部元素lis1.pop_back();// 在第二个位置插入元素"2B"lis1.insert(++lis1.begin(), "2B");// 在倒数第二个位置插入元素"2Y"lis1.insert(--lis1.end(), "2Y");// 保存迭代器指针// list<string>::iterator 整体为迭代器类型list<string>::iterator iter = lis1.begin();// 修改第一个元素,此时迭代器指向第一个元素*iter = "One";// 取出元素,此时迭代器指向第一个元素cout << *iter << endl;// 移动迭代器// 参数1:移动的迭代器指针// 参数2:移动的距离,可以为负,反向移动advance(iter, 3);// 在第四个元素的位置插入"444"lis1.insert(iter, "444");// 删除倒数第一个元素lis1.erase(--lis1.end());// 清空//lis1.clear();// 排序——按照大小和编码lis1.sort();// 不能下标所以不支持普通的for循环遍历,但是支持for-each遍历for (string s:lis1)cout << s << " ";cout << endl;// 迭代器遍历:略return 0;
}

deque队列

  deque 的性能位于 vector 和 list 之间,是一种性能均衡的容器;由于队列特性,首尾两端操作比较高效;deque 基本支持所有的常用API接口;
  将 vector 向量与 list 列表中的 vector 与 list 改为 deque。

关联容器

  map是单重键值对映射;multimap允许一个键对应多个值,map更为常用。
  键必须唯一,通常使用字符串类型;值可以重复,可以是任何类型。
  示例:

#include <iostream>
#include <map> // 引入头文件
using namespace std;
int main()
{// 创建一个元素为空的map对象map<string, int> map1;// 判空cout << "是否为空:" << map1.empty() << endl;// 添加元素 方法2//将键值对做成一个对象,类型为pair,也是一个模板的类,pair<键和值的类型>map1.insert(pair<string,int>("country", 86));// 添加元素 方法1map1["heigth"] = 180;map1["salary"] = 10000;map1["age"] = 40;map1["weight"] = 180;// 再次赋值就是修改键对应的值map1["weigth"] = 70;// 删除元素——返回0删除失败,成功则为删除的数量if(map1.erase("salary"))cout << "删除成功,还剩下" <<  map1.size() << "个键值对" << endl;elsecout << "删除失败" << endl;// map1.find("");返回迭代器指针,迭代器指针有两个属性first,second// 如果有对应的键,则指向键值对// 如果没有对应的键,则指向“最后一个元素的后面”// 取出元素//cout << map1.find("salary")->second << endl; 取出某个键对应的值map<string,int>::iterator iter =  map1.find("salary");if(iter != map1.end()){int value = iter->second;cout << value << endl;}elsecout << "没有对应的值!" << endl;// 清空map1.clear();cout << map1.empty() << endl;return 0;
}

  map1.find(“”);函数返回的迭代器指针,其指向的位置有两个属性first键second值
  定义一个指针iter接收find函数返回值
    map<string, int>::iterator iter = map1.find(“salary”);
    对应键:iter指向键值对
    对应键:iter指向最后一个元素的后面,输出随机值
    避免取出随机值

if(iter != map1.end()) //有键值对
cout << iter->second << endl;//取值second
else // 无键值对

迭代器

  特点:所有的容器类型都支持迭代器遍历。
  分类:iterator是读写迭代器;const_iterator是只读迭代器
  示例:

#include <iostream>
#include <array>
#include <vector>
#include <list>
#include <deque>
#include <map>
using namespace std;
int main()
{string str = "ABC678%^";// string的只读迭代器string::const_iterator iter_s;for(iter_s = str.begin(); iter_s != str.end(); iter_s++)cout << *iter_s << " ";cout << endl;array<double,6> arr;arr.fill(3.14);// array的读写迭代器array<double,6>::iterator iter_a;for(iter_a = arr.begin(); iter_a != arr.end(); iter_a++)cout << ++(*iter_a) << " ";cout << endl;vector<int> vec1(4,4);// vector的只读迭代器vector<int>::const_iterator iter_vec = vec1.begin();while(iter_vec != vec1.end()){cout << *iter_vec << " ";iter_vec++;}cout << endl;list<string> lis1;lis1.push_back("fhdjks");lis1.push_back("fhfggks");lis1.push_back("dsdsghs");lis1.push_back("fh***");// list的读写迭代器list<string>::iterator iter_lis = lis1.begin();while(iter_lis != lis1.end()){cout << (*iter_lis).append("~") << " ";iter_lis++;}cout << endl;deque<int> deq(5,5);// deque的读写迭代器,也可以只读deque<int>::iterator iter_d;for(iter_d = deq.begin(); iter_d != deq.end(); iter_d++)cout << *iter_d << " ";cout << endl;map<string,string> map1;map1["城市"] = "济南";map1["name"] = "Tom";map1["age"] = "7";map1["friend"] = "Jerry";// map的只读迭代器for(map<string,string>::const_iterator iter = map1.begin();iter != map1.end();iter++){cout << iter->first << "-"; // 键cout << iter->second << endl; // 值}return 0;
}

  以上为本人目前对容器的了解,内容不多,这些可以随时查到,鄙人首次学习C++,纯小白,如有错误,还请各位大神不吝赐教,引用大佬的一句话:计算机,只要肯学习,永远是yyds。

C++中容器的分类以及相关用法相关推荐

  1. Java中Date各种相关用法

    Java中Date各种相关用法 本文主要介绍Java中Date各种相关用法. AD:   Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=C ...

  2. 计算机相关分类号,中图法分类号(计算机专业) TP

    中图法分类号(计算机专业) T 工业技术 TP 自动化技术.计算机技术 TP3 计算技术.计算机技术 TP3-0 计算机理论与方法 TP3-05 计算机与其他学科的关系 TP30 一般性问题 TP30 ...

  3. C++STL与泛型编程(3)容器之分类与测试

    文章目录 容器的分类 序列式容器(sequence containers)代码示例 辅助函数 array 容器 array容器的测试代码 测试代码中部分函数解析 vector 容器 vector 容器 ...

  4. slf4j log4j logback关系详解和相关用法 【by Sinte-Beuve】

    slf4j log4j logback关系详解和相关用法 slf4j log4j logback的关系 The Simple Logging Facade for Java是什么? log4j和log ...

  5. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  6. python列表方法语句_Python中列表和元组的相关语句和方法讲解

    列表(list): 首先,列表属于序列,那么序列类型可用如下内建函数-- list(iter):把可迭代对象转换为列表. str(obj):把obj对象转换为字符串,即用字符串来表示这个对象. tup ...

  7. 手把手教你在Python中实现文本分类(附代码、数据集)

    作者: Shivam Bansal 翻译:申利彬 校对:丁楠雅 本文约2300字,建议阅读8分钟. 本文将详细介绍文本分类问题并用Python实现这个过程. 引言 文本分类是商业问题中常见的自然语言处 ...

  8. python中list[1啥意思_详解Python中list[::-1]的几种用法

    本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下: s = "abcde" list的[]中有三个参数,用冒号分割 list[param1:para ...

  9. 从重采样到数据合成:如何处理机器学习中的不平衡分类问题?

    从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 2017-03-19 13:17 来源:机器之心 技术 原标题:从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 选自Analytic ...

最新文章

  1. 设置更改root密码(远程,本地)、连接mysql、mysql常用命令
  2. 成功解决WARNING: Ignoring invalid distribution -illow (E:\program files\python\python36\lib\site-package
  3. 【AutoML】强化学习如何用于自动模型设计(NAS)与优化?
  4. 超详细前端开发案例:品优购商场项目(一)
  5. 二维分类教案_幼儿园中班数学教案中班数学教案二维排序——师乐汇幼儿教师教育网...
  6. python读取Excel工作簿、工作表
  7. github 代理_GitHub访问提速方法
  8. 121. 买卖股票的zui佳时机(JavaScript)
  9. Data Lake Analytics IP白名单设置攻略
  10. 图中两点所有路径_8数培优:一只很励志的蚂蚁,揭示空间最短路径问题
  11. php 横杠箭头,为什么我的箭头下面有一横线?
  12. python机器学习应用mooc_(3)决策树
  13. 计算机用户名改成英文,win10如何把用户名改成英文
  14. 解决使用百度地图默认定位是北京的问题
  15. 谷歌浏览器设置主页教程
  16. 教你查看网页的记住密码和免费下载付费音乐
  17. Spring Security OAuth2搭建认证授权中心、资源服务中心、并结合网关校验的完整详细示例
  18. vue加载vue-amap 报错解决办法
  19. 【论文 | 复现】YOLO-landmark detection
  20. maven学习笔记(四)profile的使用

热门文章

  1. 英雄杀小程序微信区分服务器吗,英雄杀小程序
  2. 蓝桥杯 ADV168 算法提高 快乐司机(贪心 快排)(java)
  3. 国内开源社区有哪些 ?|GitCode
  4. python文件读取下一个字符_python文件的读写总结
  5. 计算机php什么意思,pc什么意思
  6. Oracle connect by与level的使用
  7. 智慧电厂拥抱“双碳”,空冷岛设施数字化转型
  8. 适用于***测试不同阶段的工具收集整理
  9. 编程实用工具大全(前后端皆可用,不来瞅瞅?)
  10. DockerK8s---跟我一步步部署K8s(二进制安装部署)