STL用法总结(一)(vector,stack,queue)

1.STL用法总结

容器分为序列式容器关联式容器

序列式容器:每个元素有固定的位置,取决于插入的时间,与元素值无关。例如,vector,queue,deque,list,stack,

关联式容器:取决于特定的排序准则,和插入顺序无关。例如,set,multiset,map,multimap。

1.vector(向量)

头文件:

#include <vector>

1.1 介绍

vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素。

注意在局部区域中(比如局部函数里面)开vector数组,是在堆空间里面开的。

在局部区域开数组是在栈空间开的,而栈空间比较小,如果开了非常长的数组就会发生爆栈。

故局部区域不可以开大长度数组,但是可以开大长度vector

1.2 一维数组初始化

vector<int> a; //定义了一个名为a的一维数组,数组存储int类型数据
vector<double> b;//定义了一个名为b的一维数组,数组存储double类型数据
vector<node> c;//定义了一个名为c的一维数组,数组存储结构体类型数据,node是结构体类型

指定长度初始值的初始化

vector<int> v(n);// 定义一个长度为n的数组,初始值默认为0,下标范围[0, n - 1] 
vector<int> v(n, 1);// v[0] 到 v[n - 1]所有的元素初始值均为1 //注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)

拷贝初始化

vector<int> a(n + 1, 0); vector<int> b(a); // 两个数组中的类型必须相同,a和b都是长度为n+1,初始值都为0的数组
vector<int> c = a; // 也是拷贝初始化,c和a是完全一样的数组

1.3 二维数组初始化

定义第一位维固定长度为 5,第二维可变化的二维数组

vector<int> v[5];//定义可变长二维数组
 //注意:行不可变(只有5行), 而列可变,可以在指定行添加元素 
//第一维固定长度为5,第二维长度可以改变

2.方法函数

代码含义
q.front()返回第一个数据O ( 1 )
q.back()返回最后一个数据
q.pop_back()删除最后一个数据
q.push_back(ele)尾部添加一个数据
q.size()返回容器内元素个数
q.clear()清除所有元素
q.resize(n,v)改变数组大小为 n,每个空间赋为 v,默认赋值0
q.insert(it,x)向迭代器it,插入一个元素x。O(n)
q.erease(begin,end)删除[begin,end) 的所有函数
q.begin()返回首元素的迭代器
q.end()返回最后一个迭代器
q.empty()判断是否为空,为空为1,否则为0

其中,q.end() 返回的是最后一个位置的后一个位置,所有STL容器都如此

使用 vi.resize(n, v) 函数时,若 vi 之前指定过大小为 pre

pre > n :即数组大小变小了,数组会保存前 n 个元素,前 n 个元素值为原来的值,不是都为 v pre < n :即数组大小变大了,数组会在后面插入 n - pre 个值为 v 的元素 也就是说,这个初始值 v 只对新插入的元素生效。

排序使用sort,为 sort(q.begin(),q.end());

对所有元素排序,如果要指定区间进行排序,可以对参数进行改动

vector<int> a(n + 1); sort(a.begin() + 1, a.end()); // 对[1, n]区间进行从小到大排序

2.1 访问

1.下标法:和普通数组一样,下标是从 0开始的

2.迭代器:类似指针一样的访问

vector<int> vi; //定义一个vi数组 vector<int>::iterator it = vi.begin();
//声明一个迭代器指向vi的初始位置

vector<int>::iterator it = vi.begin(); for(int i = 0; i < 5; i++) cout << *(it + i) << " "; cout << "\n";

3.使用auto:但是会访问数组的所有元素(包括0),auto能自动识别并获取类型

// 1. 输入 
      vector<int> a(n); for (auto &x: a) { 
          cin >> x;// 可以进行输入,注意加引用 }
 // 2. 输出 
    vector<int> v;
      v.push_back(12);
      v.push_back(241); 
     for(auto val : v) {
       cout << val << " "; // 12 241 }

2.stack(栈)

1.介绍

是一个先进后出,后进先出的容器。

//头文件需要添加 
#include<stack>
//声明 
stack<int> s; stack<string> s; stack<node> s;//node是结构体类型

2.方法函数

代码含义
s.push(ele)元素ele入栈,增加元素
s.pop()移除栈顶元素
s.top()取得栈顶元素(不删除)
s.empty()检测栈内是否为空
s.size()返回栈内元素个数

2.1 遍历

栈只能对栈顶进行操作,如果遍历,需要一个一个取出

stack<int> st; 
for (int i = 0; i < 10; ++i) 
st.push(i);
 while (!st.empty()) {
 int tp = st.top(); // 栈顶元素
 st.pop(); }

3.queue(队列)

1.介绍

队列是一种先进先出的数据结构

//头文件 
#include<queue> 
//定义初始化 
queue<int> q;

2.方法函数

代码含义
q.front()返回队首元素
q.back()返回队尾元素
q.push(ele)尾部添加一个元素ele进队
q.pop()删除队首元素
q.size()返回队内元素个数
q.empty()判断是否为空,为空返回 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值