c++11学习笔记(7)
(1)顺序容器和关联容器的不同之处在于两者组织元素的方式。这些不同之处直接关系到元素如何存储、访问、添加以及删除。上一节介绍了所有容器都支持的操作,接下来将介绍顺序容器所特有的操作。
(2)除了array之外,所有标准库容器都提供了灵活的内存管理。在运行的时候可以动态添加或删除元素来改变容器大小。当我们向顺序容器中添加元素的时候,必须记得不同容器使用不同的策略来分配元素空间,而这些策略直接影响性能。
(3)在一个vector或string的尾部之外的任何位置,或是一个deque的首尾之外的任何位置添加元素,都需要移动元素。而且,向一个vector或string添加元素可能引起整个对象存储空间的重新分配。重新分配一个对象的存储空间需要分配新的内存,并将元素从旧的空间移动到新的空间中。
(4)push_back将一个元素追加到一个vector尾部,除了array和forward_list之外,每个顺序容器(包括string类型)都支持push_back。例如下面的循环每次读取一个string到word中,然后追加到容器尾部。
string word; while(cin >> word) container. push_back(word);
对push_back的调用在container尾部创建了一个新的元素,将container的类型可以是list/vector/deque。
(5)由于string是一个字符容器,我们也可以用push_back在string的末尾添加字符。
void pluralize(size_t cnt, string &word) { if (cnt > 1) word. push_back('s'); }
(6)除了push_back,list、forward_list、deque容器还支持名为push_front的类似操作,此操作将元素插入到容器头部。
list<int> ilist; for(size_t ix=0; ix != 4; ++ix) ilist. push_front(ix);
ilist保存序列3210
(7)deque像vector一样提供了随机访问元素的能力,但它提供了vector所不支持的push_front,deque保证在容器收尾进行插入和删除操作的时候都只花费常数时间。和vector一样,在deque首尾之外的位置插入元素会很耗时。
(8)接下来要在容器中的特定位置添加元素。push_back和push_front操作提供了一种方便在顺序容器尾部或者头部插入单个元素的方法。insert成员提供了更一般的添加功能,它允许我们在容器中的任何一个位置添加0个或多个元素。vector/deque/list/string都支持insert成员。forward_list提供了特殊的insert成员,之后会进行介绍。
(9)每个insert函数都接受一个迭代器作为其第一个参数,迭代器指出了在容器中什么位置放置新元素,它可以指向容器中的任何位置,包括容器尾部之后的下一个位置。由于迭代器可能指向容器尾部之后不存在的元素的位置,而且在容器开始位置插入元素是很有用的功能,所以insert函数将元素插入到迭代器所指定的位置之前。
slist. insert(iter, "hello");
把这串字符添加到iter之前的位置。
(10)虽然有些容器不支持push_back操作,但它们对于insert操作并无类似的限制(插入开始位置)。因此我们可以将元素插入到容器的开始位置,而不必担心容器是否支持push_front。
vector<string> svec; list<string> slist; slist. insert(slist.begin(), "hello"); //vector不支持push_front,但是也可以这样插入 svec. insert(svec.begin(), "hello");
(11)将元素插入到vector/deque/string中的任何位置都是合法的,然而这样做很耗时
(12)除了第一个迭代器参数之外,insert函数还可以接受更多的参数。下面是将10个元素插入到svec末尾,并将所有元素都初始化为string "anna"
svec. insert(svec.end(), 10, "anna");
(13)接受一对迭代器或一个初始化列表的insert版本将给定范围中的元素插入到指定位置之前。
vector<string> v={"qusi", "hsh", "hshh"}; slist. insert(slist.begin(), v.end()-2, v.end()) //上面是将v的最后两个元素添加到slist的开始 slist. insert(slist.end(), {"ebd", "hdh"});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下