c++11学习笔记(6)
(1)
list<string> a = {"mi", "li"};
auto it1 = a. begin();
auto it2 = a. rbegin();
auto it3 = a. cbegin();
auto it4 = a. crbegin();
(2)也可以显示指定类型
list<string>::iterator it5= a. begin();
当auto与begin和end相结合使用时,获得的迭代器类型依赖于容器类型,与我们想要如何使用迭代器毫不相干。
(3)每个容器类型都定义了一个默认构造函数。除了array之外,其他容器的默认构造函数都会创建一个指定类型的空容器,且都可以接受指定容器大小和元素初始值参数。
(4)当一个容器初始化为另一个容器的拷贝时,两个容器的容器类型和元素类型必须相同。
(5)对一个容器进行初始化
list<string> authors = {"mi", "li"};
vector<const char*> articles = {"a"};
(6)除了和关联容器相同的构造函数外,顺序容器(array除外)还提供另一个构造函数,它接受一个容器大小和一个可选的元素初始值,如果我们不提供元素初始值,也标准库会创建一个值初始化器。
vector<int> ivec(10, -1);
list<string> svev(10, "hi");
forward_list<int> ivec(10);
deque<string> svec(10);
(7)和内置数组一样,标准库array的大小也是类型的一部分。当定义一个array时,除了指定元素类型,还要指定容器大小。
array<int, 42>;
array<string, 10>;
为了使用array类型,我们必须同时指定元素类型和大小:
array<int, 10>::size_type i;
数组类型包括元素类型和大小。
(8)值得注意的是,虽然我们不能对内置数组类型进行拷贝或对象赋值操作,但array并没有这个限制。
int digs[10] = {0,1,2,3,4};
int cpy[10] = digs;//这是错误的,内置数组不支持拷贝或赋值
array<int, 10>digits = {0,1,2,3};
array<int, 10>copy = digits;
(9)由于右边运算对象的大小可能和左边运算对象的大小不用,因此array类型不支持assign,也不允许用花括号包围的值列表进行赋值。比如下面的就是错误的。
array<int, 10> a1={0,1,2,3,4};
a1 = {0};
(10)赋值运算符要求左边和右边的运算对象具有相同的类型。它将右边运算对象中所有元素拷贝到左边运算对象中。顺序容器还定义了一个名为assign的成员,允许我们从一个不同但相容的类型赋值,或者从容器的一个子序列赋值。
(11)assign操作用参数所指定的元素替换左边容器中的所有元素,例如我们可以用assign将一个vector中的一段char*值赋予一个list中的string。
list<string> names;
vector<const char*> oldstyle;
names=oldstyle;//错误,容器类型不匹配
names. assign(oldstyle.cbegin(), oldstyle.cend());
这段代码中对assign的调用将names中的元素替换为迭代器指定的范围中的元素的拷贝。assign的参数决定了容器中将有多少个元素以及他们的值都是什么。
【推荐】国内首个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代理 了,记录一下