C++标准模板库( STL )复习与总结(上)

本文是C++ STL的复习总结,重点介绍了vector、set、string、map和queue等容器的常见用法,包括定义、访问方式、常用函数及其适用场景。例如,vector作为变长数组,set自动排序去重,string提供了便捷的字符串操作,map用于映射关系,queue实现先进后出等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++ 中提供了标准模板库,其中封装了很多相当实用的容器,不需要我们费力的去实现它们的细节而直接调用函数来实现很多功能,十分方便,会为我们的考试节省很多时间。希望能给大家带来帮助~

(参考自 算法笔记 )

本文将介绍我们考试中常用的一些容器及用法:


  • vector 的常见用法
  • set 的常见用法
  • string 的常见用法
  • map 的常见用法
  • queue 的常见用法
  • priority_queue 的常见用法
  • stack 的常见用法
  • pair 的常见用法
  • algorithm 头文件下的常用函数

一、vector 的常见用法

vector 翻译成向量,这理解成 “ 变长数组 ”,其长度可以根据需要自动改变。

头文件#include <vector> 。除此之外还得在下面加上 using namespace std ;

1.vector 的定义

vector<typename> name;

typename 可以是任何基本类型,例如:

vector<int> a;
  vector<double> a; 
  vector<char> a;    
  vector<node> a; //结构体类型
  vector<vector< int > > a;  //也可以是 vector 类型,此时两个‘>’之间一定要有空格(防止被c++11之前的编译器当作移位操作,导致编译错误)

· vector 数组的定义

vector<typename> Arrayname[size];

例如:vector<int> vi[100];这里的每一个 vi[i] 都是一个容器。

2.vector 容器内元素的访问

  • 通过下标访问:同数组。例如 一个定义为 vector a 的 vector 容器来说,直接访问下标即可( a[0] 、a[1] )。
  • 通过迭代器访问(可以理解为类似指针的东西):
    其定义为:
    vector < double > :: iterator it;
    用 *it 来访问 vector 中的元素,像指针那样访问即可

**

注: 需要指出的是,在常用STL容器中,只有 vector 和 string 中才允许使用 vi.begin()+1 这种迭代器加上整数的写法!**

3.vector 常用函数

 vector<int> vi;

  • vi.push_back(x) :在 vector 的最后添加一个元素 x ;

  • vi.pop_back(x) : 删除 vector 的尾元素

  • vi.size() : 获取 vi 中元素的个数

  • vi.clean() : 清空 vector 中的所有元素

  • vi.insert( it , x ) : 向 vector 的任意迭代器 it 处插入一个元素 x (不会覆盖此处的元素,当前位置及以后位置元素元素会依次后移)

  • vi.erase() : 删除指定位置元素,有两种用法
    1.删除单个元素:vi.erase( it )
    2.删除指定区间内的所有元素:vi.erase( right, left)即为删除 [ right,left ) 内的所有元素

  • vi.begin() 、 vi.end() : 即为获取 vi 的首地址和尾元素地址的下一个地址

4.在以下情况可以使用 vector 容器

  • vetor可以作为数组使用,在元素个数不确定的场合可以很好的节省空间
  • 有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开。为了更方便的处理最有后一个满足条件的数据后面没有多余的空格,可以先用vector记录所有需要输出的数据,然后一次性输出。
  • 用来实现连接表存储图(对不太熟悉指针的童鞋来说是一个比较方便的写法)

二、set 的常见用法

set翻译为集合,是一个内部自动有序且不含重复元素的容器。

头文件:#include <set> 。除此之外还得在下面加上 using namespace std ;

1. set 的定义

set< typename > name;

它的定义写法和vector基本一样,其实大部分 STL 都是这样定义的~在此就不再赘述 ~

2.set 容器内元素的访问

set 只能通过迭代器(iterator)访问:
set< double > :: iterator it;然后通过 *it 来访问 set 里的元素。

3.set 常用函数

   set<int> st;

  • st.insert(x) : 将 x 插入到 set 容器中,并自动从小到大排序和去重

  • st.find(x) : 返回 set 中对应值为 x 的迭代器(可以理解为 x 元素的地址)

  • erase() : 删除指定位置元素,有两种用法:删除单个元素;删除指定区间内的所有元素。
    1.删除单个元素
    有两种方法
    ·st.erase(it) : it 为所需删除元素的迭代器;(可结合 find 函数配合使用)
    ·st.erase(x) : x 为所需删除元素的值;
    2.删除指定区间内的所有元素
    st.erase( right, left) 即为删除 [ right,left ) 内的所有元素,其中 right 为所需删除的区间的起始迭代器,left 为区间的末尾迭代器的下一个地址。

  • st.size() : 获取 set 元素的个数

  • st.clean() : 清空 set 中的所有元素

4.set 容器的使用场合
set 最主要的功能就是自动去重并按升序排序,因此碰到需要去重但是不方便直接开数组的情况,就可以用 set 解决。

: set 中元素的值是唯一的,如果想用 set 处理不唯一的情况,可以使用 multiset
如果想只去重不排序,可以用 unorder_set

三、string 的常见用法

string 翻译为字符串,c++对字符串常用的需求功能进行了封装,使得操作更加的方便。
头文件#include <string>(注意 string 和 string.h 是不同的头文件) 。除此之外还得在下面加上 using namespace std ;

1.string 的定义

string str;
如果要赋值:string str = ''abcd'';

2.string 中内容的访问

  • 2.1 通过下标访问
    直接像字符数组那样去访问 string :
    例如:
int main()
{
   string str = ''abcd'';
   for(int i=0;i < str.length();i++)
   {
   	printf("%c",str[i]);
   }
   return 0;
}

输出结果:

abcd

如果要读入和输出整个字符串,则用 cin 和 cout
cin>>str;
cout<<str;

注:如果要用 printf 来输出 string ,就得用 c_str() 将 string 类型转换成字符数组进行输出:
printf("%s\n", str.c_str());

  • 2.2 通过迭代器访问
    一般用上面那种方法就可以满足访问的需求,但是 insert() 与 erase() 函数要求以迭代器作为参数,所以我们还是学习一下 string 的迭代器用法:
    string::iterator it;
    然后通过 *it 访问 string 里面的每一位。

3. string 的常用函数


  • operator+= :将两个 string 直接拼接起来
	string str1 = ''abcd'' , str2 = ''xyz'' , str3;
	str3 = str1 + str2;
        cout<<str3;

输出结果:
abcdxyz


  • compare operator:string 可以直接使用 ==、!=、<、<=、>、>= 比较大小,比较规则是字典序

  • length() / size() : 得到字符串的长度

  • insert() : 插入,有很多写法,这里给出几个常用写法。
    ·insert(pos,string) : 在 pos 号位置插入字符串 string
    ·insert(it,it2,it3): 用来表示 [it2,it3) 将被插在 it 的位置上。 it 为原字符串将要插入的位置,it2 和 it3 为待插字符串的首尾迭代器。

  • erase():删除元素,同上述的 set 容器中 erase() 函数。
    就是删除一个区间的所有元素还可以写成:erase(pos,len);

  • clean() : 清空 string 中的数据

  • substr(pos,len) : 截取字符串的一个从 pos 号位开始,长度为 len 的子串;

  • string::npos : 是一个常数,本身值为 -1 或者 4294967295(unsigned_int 类型的最大值),作为 find 函数失配时的返回值

  • find(str2) : 当 str2 是 str 的子串时,返回其在 str 中第一次出现的位置,否则返回 string::npos 。
  • find(str2,pos) : 从 str 的 pos 位开始匹配,返回值同上。

  • replace(pos,len,str2) : 把 str 从 pos 位开始,长度为 len 的子串替换成 str2;
  • replace(it1,it2,str2) :把 str 迭代器[it1,it2) 范围的子串替换成 str2;

四、map 的常用用法

map 翻译为映射。map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)。

头文件#include <map> 。除此之外还得在下面加上 using namespace std ;

1.map 的定义

map<typename1,typename2> mp;
typename1 是映射前的类型,typename2 是映射后的类型

2.map 中的访问

map<char ,int> mp;

  • 通过下标访问:mp['c']
  • 通过迭代器访问:
    map<typename1,typename2>::iterator it; map 使用 it->first 访问映射前的值,it->second 访问映射后的值。(map 会以映射前的值从小到大的顺序自然排序,是因为 map 内部是通过红黑树实现的, set 也是)

3.map 的常用函数


find(key) :返回键为 key 的映射的迭代器


erase() :删除元素,同前面几种容器,多一种写法:erase(key)


size() : 映射的对数


clean() : 清空所有元素


4.map 使用的场合

  • 需要建立字符(或者字符串)与整数之间的映射关系,使用 map 可以减少代码量
  • 判断大整数或者其他类型数据是否存在的题目,可以把 map 当作 bool 数组来用
  • 字符串和字符串之间的映射也会用到

五、queue 的常见用法

queue 翻译为队列。先进后出的容器。

头文件#include <queue> 。除此之外还得在下面加上 using namespace std ;

1.queue 的定义

queue< typename > name;

2.queue 中的访问

只能通过 front() 访问队首元素,通过 back() 访问对位元素

queue< int > q;
......
printf("%d %d",q.front(),q.back());

3.queue 的常用函数


push(x) :元素x入队


pop(): 首元素出队


front():获得队首元素


back():获得队尾元素
注:使用使用front()pop()前,必须使用empty()判断队列是否为空


empty():检测是否为空


size() : 返回元素个数


4.queue 的使用场合

  • 实现 BFS(广度优先搜索)时,可以用 queue ,以提高程序准确性

注:STL的容器中还有两种容器和队列有关,分别是双端队列(deque)优先队列(priority_queue),前者是首尾皆可插入删除的队列,后者是用堆实现的默认将当前队列最大元素置于队首的容器。

推荐阅读

C++标准模板库( STL )复习与总结(下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值