AcWing C++语法笔记第八节STL容器

1、该系列为ACWing中c++语法课,已购买正版,课程作者为yxc(请大家支持正版)。
2、为啥写在这儿,问就是oneNote的内存不够了QAQ

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容器的“指针”(或循环变量,但循环变量是数组下标),可以用星号*操作符解除引用。
一个保存intvector的迭代器声明方法为:

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

所有的容器都可以视作一个“前闭后开”的结构。

beginend是两个特殊的迭代器。

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] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值