1、该系列为ACWing中c++语法课,已购买正版,课程作者为yxc(请大家支持正版)。
2、为啥写在这儿,问就是oneNote的内存不够了QAQ
ACwing C++ 语法笔记8STL容器
0、简介
容器(STL)是存数据的东西,string
/vector
都是容器。
STL是提高C++编写效率的一个利器。
一、 vector容器
vector
是变长数组(可以自动改变长度的数组),支持随机访问,不支持在任意位置 O(1) 插入。为了保证效率,元素的增删一般应该在末尾进行。
例如:开最大长度为10,0000的数组,个数小于等于10,0000,数组总长度小于等于100,0000。如果用数组定义则为 int q[100000][100000]
需要40G的空间。因此我们需要vector
用多少开多少空间。
1.1 声明
#include <vector> // 头文件
using namespace std;
vector<int> a; // 相当于一个长度动态变化的int数组
vector<int> b[233]; // 相当于第一维长233,第二位长度动态变化的int数组
struct rec{
int x, y;
};
vector<rec> c; // 自定义的结构体类型也可以保存在vector中
1.2 size/empty
size
函数返回vector
的实际长度(包含的元素个数),empty
函数返回一个bool
类型,表明vector
是否为空。二者的时间复杂度都是 O(1)。
vector<int> a;
a.size();
a.empty();
所有的STL容器都支持这两个方法,含义也相同,之后我们就不再重复给出。
1.3 clear
clear
函数把vector
清空(vector
特有)。
vector<int> a;
a.clear();
1.4 迭代器
迭代器就像STL容器的“指针”(或循环变量,但循环变量是数组下标),可以用星号*
操作符解除引用。
一个保存int
的vector
的迭代器声明方法为:
vector<int> a;
vector<int>::iterator it = a.begin();
it //相当于访问a[0]
it+2 //相当于访问a[2]
*it //取迭代器的值
a.begin()
是a
的起始迭代器。
vector
的迭代器是“随机访问迭代器”,可以把vector
的迭代器与一个整数相加减,其行为和指针的移动类似。可以把vector
的两个迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标之间的距离。
1.5 begin/end
所有的容器都可以视作一个“前闭后开”的结构。
begin
和end
是两个特殊的迭代器。
begin
函数返回指向vector
中第一个元素的迭代器(返回第一个元素的地址)。例如a
是一个非空的vector
,则*a.begin()
与a[0]
的作用相同。
end
函数返回vector
的尾部,即第n
个元素再往后的“边界”(最后一个位置的下一个位置)。*a.end()
与a[n]
都是越界访问,其中n = a.size()
。
下面两份代码都遍历了vector<int> a
,并输出它的所有元素。
#include <iostream>
#include <vector>
using namespace std;
int main(){
//初始化
vector<int> a({
1, 2, 3});
cout << a[0] << ' '<< *a.begin()) << endl; //查看这两个值是否相同;
//遍历
for (int i = 0; i < a.size(); i ++)
cout << a[i] << ' ';
cout << endl;
for (vector<int>::iterator it = a.begin(); it != a.end(); it ++)
//for (auto it = a.begin(); it != a.end(); it ++)
cout << *it << ' ';
cout << endl;
for (int x:a) cout << x << ' ';
cout << endl;
}
1.6 front/back
front
函数返回vector
的第一个元素,等价于*a.begin()
和a[0]
。
back
函数返回vector
的最后一个元素,等价于*-- a.end()
和a[a.size() – 1]
。
vector<int> a({
1, 2, 3});
cout << a.front() << ' '<< a[0]