《算法基础课》第二章节 STL容器介绍

《算法基础课》第二章节 STL容器介绍

1.Vector

1.1 介绍

vector是变长数组,数组长度可以动态地变化,基本思想是倍增的思想:vector自动变长,但由于C++的特点,当系统为某一个程序分配空间时,所需的时间基本上与空间大小无关,与申请次数有关,所以变长数组要尽量减少申请次数

1.2 定义方式

vector<int> a;  //定义vector

vector<int> a(N,X);  //定义vector使其长度为N,每一个元素为X

vector<int> a[10];  //定义vector数组(10个vector)

1.3 支持函数

a.size()  //返回vector里元素个数 时间复杂度为O(1)

a.empty()  //判断vector是否为空,空返回True,非空返回False

a.clear()  //清空vector

a.front()  //返回第一个数

a.back()  //返回最后一个数

a.push_back()  //向vector最后插入一个数

a.pop_back()  //把vector最后一个数删掉

a.begin()  //迭代器,vector的第0个数

a.end()  //迭代器,vector最后一个数的后面一个数

1.4 其他

  • 遍历方法(三种)
    //方法一:直接遍历
    for(int i=0;i<a.size();i++) cout<<a[i]<<' ';
    cout<<endl;
    
    //方法二:迭代器(可以看成指针)
    for(vector<int>::iterator i=a.begin();i!=a.end();i++ )  cout<<*i<<' ';
    //a.begin()其实就是a[0]  a.end()其实就是a[a.size()]
    //其中vector<int>::iterator可以直接写成auto
    //auto是C++的关键字,可以让系统自动推断类型的关键字,当类型名较长时写auto会特别省事
    
    //方法三:C++的范围遍历,C++使用的一种新的语法,代码会短一些,效率会快一些
    for(auto x:a) cout<<x<<' ';
  • 黑科技
    vector支持比较运算,vector可以按照字典序进行比较运算,如vector a(4,3),b(3,4)中,a<b

2.Pair

2.1 介绍

pair的作用是存储一个二元组,前后两个变量类型是任意的,假设某一个东西有两种不同的属性,我们就可以用pair来存,也可以用来存储三个属性,可以看成帮我实现了一个结构体,并且自带了比较函数

2.2 定义方式

  pair<int,string> p;
 
  pair<int,pair<int,int>> p;  //存储三个属性


  //初始化
  p=make_pair(10,"yzl");
  p={10,"yzl"}

2.3 支持函数

  p.first  //取第一个元素
  p.second  //取第二个元素
  

2.4 其他

  • 支持比较运算,以first为第一关键字,以second为第二关键字(字典序)

3.String

3.1 介绍

string其实是C++把字符串进行了封装,用string来存很方便

3.2 定义方式

  string s;
  string s="abc";  //定义字符串

3.3 支持函数

  s.size();
  s.empty();
  s.clear();

  s.length();  //返回字符串长度,与size作用相同
  s.substr(st,l);  //返回子串,从下标st开始返回长度为l的子串
  //当l省略时,直接返回从下标st开始的整个子串
  //当l长度过大,超过字符串本身时,就会输出到字符串结尾为止
  
  s.c_str();  //返回string s存储字符数组的起始地址
  printf("%s\n",a.c_str());

3.4 其他

  • 字符串的添加
  string a="abc";
  a+="def";  //添加一个字符串
  a+='g';  //添加字符

此时a的内容为abcdefg

4.Queue

4.1 介绍

队列

4.2 定义

  queue<int> q;
  
  q=queue<int>();

4.3 支持函数

  q.size();
  q.empty();
  //无clear函数,若想清空,可以重新构造一个队列
  
  q.push()  //向队尾插入一个元素
  q.front()  //返回队头元素
  q.back()  //返回队尾元素
  q.pop()  //弹出队头元素

5.Priority_queue


6.Stack

6.1 介绍

6.2 定义

  stack<int> stk;

6.3 支持函数

  stk.size();
  stk.empty();
  //无clear函数
  
  stk.push()  //向栈顶插入一个元素
  stk.top()  //返回栈顶元素
  stk.pop()  //弹出栈顶元素

7.Deque


8.Set

8.1 介绍

set分为set和multiset,set不能有重复元素,multiset可以有重复元素

8.2 支持函数 (复杂度都为O(logn))

  set.size();
  set.empty();
  set.clear();
  set.begin();
  set.end();  //支持++,--操作,返回前驱和后继
  
  set.insert();  //插入一个数
  set.find();  //查找一个数,若不存在返回end迭代器
  set.count();  //返回某一个数的个数
  
  set.erase();  //删除操作
  set.erase(x);  //输入一个数,删除所有x; O(k+logn);
  set.erase(迭代器);  //输入一个迭代器,删除这个迭代器
  
  set.lower_bound(x);  //返回大于等于x的最小的数的迭代器
  set.upper_bound(x);  //返回大于x的最小的数的迭代器

9.Map

9.1 介绍

可以像用数组一样使用map,但时间复杂度为logn

9.2 定义

  map<string,int> a;
  a["yzl"]=1;
  cout<<a["yzl"]<<endl;

9.3 支持函数

  map.size();
  map.empty();
  map.clear();
  map.begin();
  map.end();  //支持++,--操作,返回前驱和后继
    
  map.insert();  //插入的是一个pair
  map.erase();  //输入的参数是pair或者迭代器
  map.find();  
  map.lower_bound(x);  //返回大于等于x的最小的数的迭代器
  map.upper_bound(x);  //返回大于x的最小的数的迭代器

10.Unordered_set


11.Bitset

posted @ 2022-01-25 16:47  白也_y  阅读(51)  评论(0)    收藏  举报