当前位置:网站首页>19.2 容器分类、array、vector容器精解
19.2 容器分类、array、vector容器精解
2022-06-28 18:10:00 【zzyzxb】
stl的组成部分
容器、迭代器、算法(函数)、分配器(分配内存)、其他(适配器、仿函数/函数对象等等)。
一:容器的分类
vector、list、map,容器是保存数据的
STL中的容器可以分为三大类
<1>顺序容器(Sequence containers):放进去在哪里,这个元素就排在哪里。比如:array、vector、deque、list、forward_list。
<2>关联容器(Associative Containers):元素是键/值对,使用键(key)来找值(value)特别适合做查找。根据键自动在内部排序,能控制插入内容,但是不能控制插入位置。比如:set、multiset、map、multimap、hash_set、hash_map、hash_multiset、hash_multimap。内部可能使用树、哈希表来实现。
<3>无序容器(Unordered Containers):c++11中推出。元素的位置不重要,重要的是这个元素是否在这个容器中。无序容器也属于一种关联容器。随着元素的的插入,每个元素在容器中的位置可能随着发生改变。比如:unordered_set、unordered_multiset、unordered_map、unordered_multimap。内部可能使用哈希表来实现。

官方有一句话:c++标准并没有规定任何容器必须使用任何特定的实现手段。
二:容器的说明和应用事项例
<1>array:是个顺序容器,其实是个数组,内存空间是连续的,大小是固定的;刚开始申请的时候是多大,他就是多大,不能再增加大小了。本质上是一个内存空间连续的数组,大小固定,不能增加它的大小。对象是连续的,但是对象指向的字符串的内存空间没有关系。
#include <array>
#include <string>
#include <iostream>
using namespace std;
void func()
{
//包含5个元素的数组
array<string, 5> mystring = { "I", "Love1Love2Love3Love4Love5Love6Love7", "China" };
cout << "myString.size() = " << mystring.size() << endl; //5
mystring[0] = "It is very long~~~~~~~~~~~~~long~~~~~~~~~~~~long";
mystring[4] = "It is very long~~~~~~~~~~~~~long~~~~~~~~~~~~long";
cout << "sizeof(string) = " << sizeof(string) << endl;
for (size_t i = 0; i < mystring.size(); ++i)
{
const char* p = mystring[i].c_str();
cout << "-----------------begin---------------------" << endl;
cout << "数组元素值 = " << p << endl;
printf("对象地址 = %p\n", &mystring[i]);
printf("指向的字符串地址 = %p\n", p);
cout << "-----------------end---------------------" << endl;
}
const char* p1 = "Love1Love2Love3Love4Love5Love6Love7";
const char* p2 = "Love1Love2Love3Love4Love5Love6Love7";
printf("p1地址 = %p\n", p1);
printf("p2地址 = %p\n", p2);
}
int main()
{
func();
return 0;
}
myString.size() = 5
sizeof(string) = 40
-----------------begin---------------------
数组元素值 = It is very long~~~~~~~~~~~~~long~~~~~~~~~~~~long
对象地址 = 000000244C30F9C0
指向的字符串地址 = 0000018DE25E5CE0
-----------------end---------------------
-----------------begin---------------------
数组元素值 = Love1Love2Love3Love4Love5Love6Love7
对象地址 = 000000244C30F9E8
指向的字符串地址 = 0000018DE25F1180
-----------------end---------------------
-----------------begin---------------------
数组元素值 = China
对象地址 = 000000244C30FA10
指向的字符串地址 = 000000244C30FA18
-----------------end---------------------
-----------------begin---------------------
数组元素值 =
对象地址 = 000000244C30FA38
指向的字符串地址 = 000000244C30FA40
-----------------end---------------------
-----------------begin---------------------
数组元素值 = It is very long~~~~~~~~~~~~~long~~~~~~~~~~~~long
对象地址 = 000000244C30FA60
指向的字符串地址 = 0000018DE25E40B0
-----------------end---------------------
p1地址 = 00007FF655DAF398
p2地址 = 00007FF655DAF398

<2>vector
(1)往后边增加元素和从后边删除元素都很快;push_back()。
(2)往中间插入元素可能导致很多后续的元素要执行重新构造,析构。效率会非常之低。
(3)查找速度应该不会太快。
vector容器内存也是挨着的, vector容器有一个 “空间”的概念,每一个空间可以装一个元素;
容器里有多少个元素可以用size()来看,而这个容器里有多少空间,可以 用capacity();
capacity()一定不会小于size();vector容器中空间的数量一定不会小于元素的数量;
用reverse可以预留空间,前提是你预先知道这个容器最多会容纳多少个元素;可以大量的提高程序的运行效率。
边栏推荐
- NFT流动性协议的安全困局—NFT借贷协议XCarnival被黑事件分析
- China gaobang brand story: standing guard for safety, gaobang pays attention to
- 双功能交联剂丨Lumiprobe 磺基花青7二羧酸研究
- 图形系统——2.view绘制
- Easyexcel learning notes
- Spark Tuning (submit job resource parameter tuning)
- Small program graduation project based on wechat campus lost and found graduation project opening report function reference
- Concept and code implementation of heap
- 数据库实验7 完整性约束
- Unity about oculus quest2 developing 002-ui interaction based on XR interaction Toolkit
猜你喜欢

数据库MySQL语句期末复习 CTGU

Mycat+分库分表

国内怎么就做不出 IDEA 那样的产品?

How to upgrade from RHEL 8 to RHEL 9

EasyExcel 学习笔记

Redis6 notes 04 master-slave replication, cluster, application problems, new redis6 features

如何高效优雅地管理接口文档

DNSLog注入

Graphic system - 1 Layout loading

Ten MySQL locks, one article will give you full analysis
随机推荐
Shanghai Pudong Development Bank Software Test interview real question
Redis6 notes 04 master-slave replication, cluster, application problems, new redis6 features
Graphic system - 2 View drawing
CANN媒体数据处理V2,JPEGD接口介绍
如何制作CSR(Certificate Signing Request)文件?
BioVendor游离轻链(κ和λ)Elisa 试剂盒检测步骤
数据资产为王,如何解析企业数字化转型与数据资产管理的关系?
Lumiprobe丨Lumizol RNA 提取试剂解决方案
工业数字化与新一代数字化系统设计平台----讲座
The MySQL installed in Alibaba cloud server is version 8. Is it because the MySQL driver version of dataworks does not support it? Now mention
基于固态激光雷达辅助的十六线机械雷达和单目相机的外参标定方法
好用、强大的PDF 阅读软件综合评测:PDF Expert 、MarginNote、LiquidText、Notability、GoodNotes、Zotero
亿信华辰:地产企业数字化转型想要把握时代机遇
Lumiprobe 蛋白质标记研究方案
IDM certification process log embedding point description
Small program graduation design based on wechat real estate intermediary house viewing appointment small program graduation design opening report function reference
做跨境电商一定要学会用PRA软件,解放双手提高效率!
东方财富软件股票开户是靠谱的吗?在哪开户安全
Common DOS commands
MySQL十种锁,一篇文章带你全解析