STL学习
十一、array数组
11.1 介绍
头文件:
1 |
array
是C++11新增的容器,效率与普通数据相差无几,比vector
效率要高,自身添加了一些成员函数。
和其它容器不同,array
容器的大小是固定的,无法动态的扩展或收缩,只允许访问或者替换存储的元素。
注意:array
的使用要在std
命名空间里
11.2 简实使用
11.2.1 声明和初始化
基础数据类型
声明一个大小位100的int型数组,元素的值不确定
1 | array<int, 100> a; |
声明一个大小为100的int型数组,初始值均为0(初始值与默认元素类型等效)、
1 | array<int, 100> a{}; |
声明一个大小为100的int
型数组,初始化部分值,其余全部为0
1 | array<int, 100> a{1, 2, 3}; |
或者可以用等号
1 | array<int, 100> a = {1, 2, 3}; |
高级数据类型
不同于数组的是对元素类型不做要求,可以套结构体
1 | array<string, 2> s = {"ha", string("haha")}; |
11.2.2. 取存元素值
修改元素
1 | array<int, 4> a = {1, 2, 3, 4}; |
访问元素
下标访问:
1 | array<int, 4> a = {1, 2, 3, 4}; |
利用auto
访问:
1 | for(auto i : a) |
迭代器访问:
1 | auto it = a.begin(); |
at()
函数访问:
下标为1
的元素加上下标为2
的元素,答案为5
1 | array<int, 4> a = {1, 2, 3, 4}; |
get
方法访问:
将a
数组下标为1
位置处的值改为x
.获取的下标只能写数字,不能填变量
1 | get<1>(a) = x; |
11.3 成员函数
成员函数 | 功能 |
---|---|
begin() | 返回容器中第一个元素的访问迭代器(地址) |
end() | 返回容器最后一个元素之后一个位置的访问迭代器(地址) |
rbegin() | 返回最后一个元素的访问迭代器(地址) |
rend() | 返回第一个元素之前一个位置的访问迭代器(地址) |
size() | 返回容器中元素的数量,其值等于初始化 array 类的第二个模板参数N |
max_size() | 返回容器可容纳元素的最大数量,其值始终等于初始化 array 类的第二个模板参数 N |
empty() | 判断容器是否为空 |
at(n) | 返回容器中 n 位置处元素的引用,函数会自动检查 n 是否在有效的范围内,如果不是则抛出 out_of_range 异常 |
front() | 返回容器中第一个元素的直接引用,函数不适用于空的 array 容器 |
back() | 返回容器中最后一个元素的直接引用,函数不适用于空的 array 容器。 |
data() | 返回一个指向容器首个元素的指针。利用该指针,可实现复制容器中所有元素等类似功能 |
fill(x) | 将 x 这个值赋值给容器中的每个元素,相当于初始化 |
array1.swap(array2) | 交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型 |
11.4 部分用法示例
data()
指向底层元素存储的指针。对于非空容器,返回的指针与首元素地址比较相等。
at()
下标为1
的元素加上下标为2
的元素,答案为5
1 | array<int, 4> a = {1, 2, 3, 4}; |
fill()
array的fill()
函数,将a
数组全部元素值变为x
1 | a.fill(x); |
另外还有其它的fill()函数:将a数组[begin,end]全部值变为x
1 | fill(a.begin(), a.end(), x); |
get方法获取元素值
将a
数组下标为1
位置处的值改为x
⭐️注意⭐️获取的下标只能写数字,不能填变量
1 | get<1>(a) = x; |
排序
1 | sort(a.begin(), a.end()); |
十二、 tuple
12.1 介绍
tuple模板是pair的泛化,可以封装不同类型任意数量的对象。
可以把tuple理解为pair的扩展,tuple可以声明二元组,也可以声明三元组。
tuple可以等价为结构体使用
❤️ 头文件
1 |
12.2 基础用法
12.2.1 声明及初始化
声明一个空的tuple
三元组
1 | tuple<int, int, string> t1; |
赋值
1 | t1 = make_tuple(1, 1, "hahaha"); |
创建的同时初始化
1 | tuple<int, int, int, int> t2(1, 2, 3, 4); |
可以使用pair对象构造tuple对象,但tuple对象必须是两个元素
1 | auto p = make_pair("wang", 1); |
12.2.2 元素操作
获取tuple对象t
的第一个元素
1 | int first = get<0>(t); |
修改tuple对象t
的第一个元素
1 | get<0>(t) = 1; |
12.3 函数操作
获取元素个数
1
2tuple<int, int, int> t(1, 2, 3);
cout << tuple_size<decltype(t)>::value << "\n"; // 3获取对应元素的值
通过
get<n>(obj)
方法获取,n
必须为数字不能是变量1
2
3
4tuple<int, int, int> t(1, 2, 3);
cout << get<0>(t) << '\n'; // 1
cout << get<1>(t) << '\n'; // 2
cout << get<2>(t) << '\n'; // 3通过
tie
解包 获取元素值tie
可以让tuple变量中的三个值依次赋到tie中的三个变量中1
2
3
4
5int one, three;
string two;
tuple<int, string, int> t(1, "hahaha", 3);
tie(one, two, three) = t;
cout << one << two << three << "\n"; // 1hahaha3