news 2026/11/2 10:01:22

C++ primer超详细讲解顺序容器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ primer超详细讲解顺序容器

顺序容器概述

(1)顺序容器类型

vector:可变数组大小,支持快速访问

deque:双端队列,支持快速随机访问,在头尾位置插入/删除速度很快

forward_list:单向链表,只支持单向顺序访问。

array:固定大小数组,不能添加或删除元素

string:和vector类似,用来保存字符

容器库概览

迭代器

迭代器范围由一对迭代器表示,,通常被称为begin和end,而end从来都不会指向范围中的最后一个元素,而是指向尾元素之后的位置,其元素范围由数学表示为:

[begin,end)

容器定义和初始化

(1)将一个容器初始化为另一个容器的拷贝

可拷贝整个容器,也可以拷贝一个指定容器的元素范围

新容器和原容器的元素类型可以不同,只要能将要拷贝的元素转换为要初始化的元素的类型即可

1

2

3

4

5

6

list<string> authors={"nuktib","sha"m"aus"}

vector<constchar*> articles={"a","an","the"}

list<string> list2(authors);//正确,类型匹配

deque<string> authList(authors)//错误,容器类型不匹配

forward_list<string> words(articles.begin(),articles.end())

//上述正确,可以将const char*元素转换为string

(2)与顺序容器大小相关的构造函数

其中一个构造函数接收一个容器大小和一个元素初始值

1

2

3

list<string> i(10,"hi")//10个strings元素,每个都初始化为"hi"

vector<int> v(10,-1)//10个int元素,每个都初始化为-1

deque<string> i(10)//10个元素,每个都是空的string

(3)标准库array具有固定大小

定义一个array时,除了指定元素类型,还要指定容器大小

1

2

array<int,42>

array<string,10>

内置数组不支持拷贝或对象赋值操作,但array无此限制

1

2

3

4

intdigs[10]={1,2,3}

intcpy[10]=digs//错误,内置数组不支持拷贝和赋值

array<int,10> d={1,2,3,4,5,6,7}

array<int,10> c=d//正确

赋值和swap

(1) assign赋值函数(仅顺序容器)

顺序容器定义了一个名为assign的成员,允许我们从一个不同但相容的类型赋值,或者从一个容器的子序列赋值。

例:

1

2

3

list<string> name;

vector<constchar*>old;

name.assign(old.cbegin(),old.cend())

上述代码将name中的元素替换为迭代器指定范围中的元素的拷贝,assign的参数决定了容器中将有多少个元素以及他们的值是什么

(2)使用swap

swap操作交换两个相同类型容器的内容

1

2

3

vector<string> v1(10);

vector<string> v2(20);

上述交换结束后,v1将会拥有20个元素,v2将会拥有10个元素

顺序容器操作

向顺序容器添加元素

(1)使用push_back

除了array和forward_list之外,每个顺序容器都支持push_back

(2)push_front

list,forward_list,deque容器还支持push_front将元素插入容器头部

1

2

3

list<int> l;

for(inti=0;i!=4;i++)

l.push_front(i)

(3)在特定位置添加元素

insert函数可在特定位置添加元素,每个insert元素都接受一个迭代器作为其第一个参数,insert函数将元素插入到迭代器所指得位置之前

虽然有些容器不支持push_front操作,但他们对于insert操作无此限制,因此可以将元素插入到容器开始的位置,不必担心容器是否支持push_front

insert另一个版本还接受一个元素数目和一个值,将指定数目的元素添加到指定位置之前。

s.insert(s.end(),10,"anna") //将10个元素插入到s的末尾

还可以接受一对迭代器或一个初始化列表插入

1

s.insert(s.end(),{"thses","as","sda","dasda"});

使用insert的返回值

1

2

3

4

5

list<string> l;

auto iter = l.begin();

string word;

while(cin >> word)

iter = l.insert(iter, word);

上述代码实现在一个特定位置反复插入元素

第一次调用insert将刚刚读取的string插入到iter所指向的元素之前,insert返回的迭代器恰好指向这个新元素,我们将此迭代器赋予iter并重新开始循环,读取下一个单词,不断循环。

访问元素

所有顺序容器都存在一个front成员函数,,除了forward_list之外的所有顺序容器都由一个back成员函数,front成员函数返回首元素的引用,back成员函数返回尾元素的引用

可以通过该引用修改容器中元素的值

1

2

3

4

5

6

if(!c.empty())

{

c.front()=42;

auto &v=c.back()

v=1024;

}

删除元素

(1)pop_front和pop_back成员函数分别删除首元素和尾元素,vector和string,forward_list不支持上述操作

(2)earse

成员函数erase从容器指定位置删除元素,也可以删除迭代器指定的单个元素,也可以删除由一对迭代器指定的范围内的所有元素,上述最终均会返回指向删除的元素之后位置的迭代器。

例:删除所有的奇数

1

2

3

4

5

6

7

8

9

list<int> ls = { 0,1,2,3,4,5,6,7,8,9 };

auto it = ls.begin();

while(it != ls.end())

{

if(*it % 2)

it = ls.erase(it);

else

it++;

}

接受一堆迭代器的erase版本允许我们删除一个范围内的元素:

例: s.erase(s.begin(),s.end())

特殊的forwa_list单向链表操作

单向链表中由于特殊的插入和删除,所以定义的函数也比较特殊

before_begin():返回指向链表首元素之前不存在的元素的迭代器,此迭代器不能解引用

insert_after(p,t):在迭代器p之后插入元素t

erase_after(p):删除p所指位置之后的元素

例:删除奇数元素:

1

2

3

4

5

6

7

8

9

10

11

12

13

forward_list<int> lst = { 0,1,2,3,4,5,6,7,8,9 };

auto pre = lst.before_begin();

auto cur = lst.begin();

while(cur != lst.end())

{

if(*cur % 2)

cur = lst.erase_after(pre);//将cur重置为erase_after的返回值,即指向cur的下一个元素

else

{

pre = cur;

cur++;

}

}

复制讲解

改变容器大小

通过resize函数可以改变容器的大小,但array不支持此操作

c.resize(n):调整c为n个元素

c.resize(n,t):调整c为n个元素,任何新添加的元素都初始化为t

vector对象是如何增长的

为了支持随机访问,vector将元素连续存储,当不得不获取新的内存控件时,vector和string通常会分配比新的控件需求更大的内存控件,容器预留这些空间作为备用,可以保存更多元素。

capacity函数告诉我们容器在不扩张内存空间情况下可以容纳多少元素

size():是指目前已经保存的元素的数目reverse(n):告诉容器至少分配容纳n给元素的空间

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 10:00:49

git describe 实战:让版本号从手工维护走向自动生成

版本号这事&#xff0c;看着是小事&#xff0c;真出了事全是大事。前阵子帮一个团队排查线上问题&#xff0c;用户报了一个诡异的数据错乱&#xff0c;我第一反应是确认部署版本。结果运维说包是从制品库流水线自动出的&#xff0c;但没人知道这个包对应哪个 commit——版本号文…

作者头像 李华
网站建设 2026/11/2 10:00:46

Dify实战指南:从Docker部署到知识库问答工作流与避坑排查

简介&#xff1a;一份关于Dify平台的大型语言模型应用构建与优化指南&#xff0c;适合希望快速上手AI应用开发的研发人员、架构师及企业技术团队。内容以Dify融合后端即服务&#xff08;BaaS&#xff09;与LLMOps理念为主线&#xff0c;系统讲解安装部署、GPT与Llama3等多模型接…

作者头像 李华
网站建设 2026/11/2 10:00:48

顺序表应用深度解析:从封装到性能优化与避坑指南

很多人学数据结构学到顺序表&#xff0c;第一反应基本都一样&#xff1a;这不就是数组吗&#xff1f;怎么还值得单独开一章笔记来写&#xff1f;我见过不少初学者就卡在这个认知上&#xff0c;结果一到自己动手写代码、做课程实验、备战考研的时候&#xff0c;才发现顺序表的应…

作者头像 李华
网站建设 2026/10/27 23:27:34

RAG私有化知识库客服系统实战:从选型到部署避坑指南

简介&#xff1a;一套基于企业私有知识库的大语言模型智能问答客服系统完整源码包&#xff0c;面向需要搭建专属问答场景的企业开发者、运维人员及技术决策者。系统支持私有化部署&#xff0c;导入企业已有文档即可构建专属知识库&#xff0c;让机器人基于内部资料精准作答&…

作者头像 李华
网站建设 2026/10/27 15:52:10

Linux死机处理全解析:软硬死机排查与SysRq/kdump实战

简介&#xff1a;面向Linux运维与故障排查人员的一份技术资料&#xff0c;聚焦系统死机或崩溃后如何有效收集与分析转储信息。资料系统梳理了三种典型机制&#xff1a;Core dump用于捕获应用程序异常崩溃时的内存现场&#xff0c;Diskdump无需网络即可在单机保留分区保存内核转…

作者头像 李华
网站建设 2026/10/27 8:34:30

企业私有知识库与LLM智能客服:RAG架构实战与私有化部署指南

简介&#xff1a;这是一套面向有私有化需求的企业技术团队的智能客服问答系统源码&#xff0c;基于企业私有知识库与大语言模型&#xff0c;解决通用LLM无法直接回答内部数据、数据安全与合规等核心问题。压缩包共1302个文件&#xff0c;大小约34.01MB&#xff0c;包含Vue、JS、…

作者头像 李华