C++STL学习之list(链表)、stack(栈)、queue(队列)、priority_queue(优先队列)、vector

C++STL学习

  • I. list列表
    • i. list的定义及初始化
    • ii. list常用函数
  • II. stack栈
    • stack的定义
    • stack常用函数
  • III. queue队列
    • i. queue的定义
    • i. queue常用函数
    • ii. priority_queue优先队列
      • i. priority_queue的定义
      • ii. priority_queue常用函数
      • iii. priority_queue自定义排序算子
  • IV. vector向量
    • i. vector的定义
    • ii. vector常用函数
    • iii. 二维vector

I. list列表

**list是C++STL库中的一个顺序容器,底层通过一个双向链表实现

i. list的定义及初始化

  • list<元素类型>链表名称
list<int>lst;//创建一个空的list
list<int>lst1(5);//创建大小为5的list
list<int>lst2(5, 1);//创建大小为5,初始化为1的list
list<int>lst3(lst2);//使用lst3创建新list
list<int>lst4(lst3.begin(), lst3.end());//同上

ii. list常用函数

  1. begin():返回指向第一个元素的迭代器(指针)
  2. end():返回指向最后一个元素的迭代器(指针)
  3. front():返回第一个元素
  4. back():返回最后一个元素
  5. push_front():在list的头部添加一个元素
  6. push_back():在list的末尾添加一个元素
  7. pop_back():删除最后一个元素
  8. pop_front():删除第一个元素
  9. rbegin():返回指向第一个元素的逆向迭代器
  10. rend():返回指向最后一个元素的逆向迭代器
  11. assign():给list赋值
  • 方法一:利用已有list的迭代器赋值
list<int>lst1(8, 1);//创建大小为8的list,并全部初始化为1。
list<int>lst2(8, 2);//创建大小为8的list,并全部初始化为2.
lst2.assign(lst1.begin(), lst1.end());
cout<<lst2.back();//back()返回最后一个元素
//输出结果为:1
  • 方法二:自定义赋值个数和值
list<int>lst1(8, 1);//创建大小为8的list,并全部初始化为1。
lst1.assign(8, 2);
cout<<lst1.back();//back()返回最后一个元素
//输出结果为:2
  1. empty():判断list是否为空,list为空则返回true
  2. get_allocator():返回list的配置器
  3. insert() 插入一个元素到list中
  4. erase():
  5. remove():从list删除元素
  6. clear():删除所有元素
  7. remove_if():按指定条件删除元素
  8. reverse():把list的元素倒转
  9. size():返回list中的元素个数
  10. max_size() 返回list能容纳的最大元素数量
  11. resize():改变list的大小
  12. splice():合并两个list
  13. merge() 合并两个list
  14. swap():交换两个相同类型的list
  15. sort():对list进行排序
  16. unique():只进行相邻元素的比较,然后去除重复值

II. stack栈

  • 栈是一种只能在头部插入和删除的顺序存储结构

stack的定义

  • stack<元素类型>栈名称
stack<int>s;

stack常用函数

  1. push(item):在栈顶插入元素item
  2. pop():删除栈顶元素
  3. empty():判断栈是否为空
  4. top():返回栈顶元素
  5. size():返回栈存储元素的个数

III. queue队列

  • queue只能访问第一个和最后一个元素,并且只能在头部进行删除,尾部进行插入的顺序存储结构

i. queue的定义

  • queue<元素类型>队列名称
queue<int>q;

i. queue常用函数

  1. push(item):将元素item插入到queue的尾部
  2. pop():删除queue的第一个元素
  3. front():返回第一个元素
  4. back():返回最后一个元素
  5. empty():判断queue是否为空
  6. size():返回当前queue中元素的个数

ii. priority_queue优先队列

  • priority_queue是一种具有queue的全部属性的同时,可以对插入元素进行自动排序的队列,默认情况下按照从大到小的顺序排列,也可以通过自定义比较算子实现不同的排序方式。

i. priority_queue的定义

priority_queue<int>priq;

ii. priority_queue常用函数

  1. push(item):将item插入到priority_queue队尾,并自行排序
  2. pop():删除队首元素
  3. top():返回队首元素
  4. empty():判断priority_queue是否为空
  5. size():返回priority_queue存储的元素个数

iii. priority_queue自定义排序算子

  • priority_queue自定义排序方式需要传入三个参数priority_queue,其中Container是储存容器,默认情况下是vector,Compare是自定义的比较函数
  • 默认从大到小排序:priority_queuepriq;
  • 从小到大排序:priority_queuepriq;
  • 结构体类型的自定义排序:cmp函数和sort中的cmp函数的效果相反
  • 方法一
struct node
{
     
	int a,b;
};
struct cmp
{
     
	bool operator()(node x,node y)
	{
     
		if(x.a==y.a)
			return x.b<y.b;
		return x.a<y.a;
	}
};
int main()
{
     
	priority_queue<node, vector<node>, cmp>priq;
}
  • 方法二:重载运算符,即改变"<"的功能
struct node
{
     
	int a,b;
	friend bool operator < (node x, node y)
	{
     
		if(x.a==y.a)
			return x.b<y.b;
		return x.a<y.a;
	}
}
int mian()
{
     
	priority_queue<node>priq;
}

IV. vector向量

  • vector是一个能存放任意数据类型的动态数组

i. vector的定义

vector<int>v;//创建一个空的vector
vector<int>v1(size);//创建大小为size的vector
vector<int>v2(size, num);//创建大小为size,值全为num的vector
vector<int>v3(v2);//使用已有vector v2创建新的vector
vector<int>v4(v2.begin(),v2.end());//使用迭代器创建新的vector

ii. vector常用函数

  1. push_back():在vector尾部插入元素
  2. insert(iterator iter, const T& num):在迭代器iter前插入元素num
  3. insert(iterator iter, int n, const T& num):在迭代器iter前插入n个num元素
  4. insert(iterator iter, const_iterator first, const_iterator last):在迭代器iter前插入相同数据类型的区间为[first, last)的vector,注意不包括last
  5. erase(iterator iter):删除迭代器iter指向的元素
  6. erase(iterator first, iterator last):删除迭代器区间为[first, last)的元素,注意不包括last
  7. pop_back():删除vector的最后一个元素
  8. clear():清空vector中的所有元素
  9. at(int pos):使用元素下标位置索引取值,vector也支持同数组一样的下标取值,如:v[1]
  10. front():返回vector的第一个元素
  11. back():返回vector最后一个元素
  12. begin():返回vector第一个元素的迭代器
  13. end():返回vector最后一个元素的迭代器
  14. rbegin():返回指向最后一个元素的反向迭代器
  15. rend():返回指向第一个元素的反向迭代器
  16. size():返回vector当前存储的元素个数
  17. capacity():返回vector所能容纳的最大元素值
  18. max_size():返回vector所能容纳的最大元素数量值
  19. swap():交换两个vector
  20. assign(int n, const T& num):将vector赋值为大小为n,值全为num
  21. assign(iterator first, iterator last):将vector赋值为已有vector中迭代器区间为[first, last)的元素
  22. sort(iterator first, iterator last):对迭代器区间为[first, last)的元素进行排序
  23. resize():改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
  24. reserve(): 改变当前vector所分配空间的大小

iii. 二维vector

  • 方法一
vector<vector<int> >v(nsize);//后需要空格,否则有的旧编译器会认为是位运算符而报错,用这种方式创建的是一个nsize行的二维vector
for(int i=0;i<v.size();i++)
{
     
	v[i].resize(msize);//为每行开辟大小为msize的存储空间,每个元素的值都为0
}
  • 方法二
vector<vector<int> >v(nsize, vector<int>(msize));//效果同上

你可能感兴趣的:(STL,stl,c++)