概述

STL:标准模版库,是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈等,C++的标准模版库包括以下三个组件(大概有六大组件,这里只着重标明三个):容器(Containers)算法(Algorithms)迭代器(iterators)

  • 容器:容器是用来管理某一类对象的集合。C++提供了各种不同类型的容器,比如queue、list、vector、map等
  • 算法:算法作用于容器,它们提供了各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
  • 迭代器:迭代器用于遍历对象集合的元素,这些集合可能是容器,也可能是容器的子集。

接下来我们对常用容器的用法进行简单的讲解,常用容器分别如下:

  • vector 向量
  • stack 栈
  • queue 队列
  • deque 双端队列
  • list 列表
  • set
  • map 字典
  • multimap 多重map、key可重复的map


vector

  • void push_back(const T& x):向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
  • iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
  • iterator erase(iterator it):删除向量中迭代器指向元素
  • iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
  • void pop_back():删除向量中最后一个元素
  • void clear():清空向量中所有元素
  • reference at(int pos):返回pos位置元素的引用
  • reference front():返回首元素的引用
  • reference back():返回尾元素的引用
  • iterator begin():返回向量头指针,指向第一个元素
  • iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
  • reverse_iterator rbegin():反向迭代器,指向最后一个元素
  • reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
  • bool empty() const:判断向量是否为空,若为空,则向量中无元素
  • int size() const:返回向量中元素的个数
  • int capacity() const:返回当前向量所能容纳的最大元素值
  • int max_size() const:返回最大可允许的vector元素数量值
  • void swap(vector&):交换两个同类型向量的数据
  • void assign(int n,const T& x):设置向量中前n个元素的值为x
  • void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

    1.push_back 在数组的最后添加一个数据 2.pop_back 去掉数组的最后一个数据 3.at 得到编号位置的数据 4.begin 得到数组头的指针 5.end 得到数组的最后一个单元+1的指针 6.front 得到数组头的引用 7.back 得到数组的最后一个单元的引用 8.max_size 得到vector最大可以是多大 9.capacity 当前vector分配的大小 10.size 当前使用数据的大小 11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值 12.reserve 改变当前vecotr所分配空间的大小 13.erase 删除指针指向的数据项 14.clear 清空当前的vector 15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1) 16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1) 17.empty 判断vector是否为空 18.swap 与另一个vector交换数据

stack

  • top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
  • push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
  • push(T&& obj):以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
  • pop():弹出栈顶元素。
  • size():返回栈中元素的个数。
  • empty():在栈中没有元素的情况下返回 true。
  • emplace():用传入的参数调用构造函数,在栈顶生成对象。
  • swap(stack & other_stack):将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同。对于 stack 对象有一个特例化的全局函数 swap() 可以使用。

    queue

    deque

    list

    **

    map

    基本内容

    导包:#include
    命名空间:std
    格式:std::map mapVar;
    map的key默认进行排序的

    插入 insert

    方式一:(再次插入相同key无效)
    mapVar.insert(pair(1, “A”));
    方式二:(再次插入相同key无效)
    mapVar.insert(make_pair(2, “B”));
    方式三:(再次插入相同key无效)
    mapVar.insert(map::value_type(3,”C”));
    方式四:(再次插入相同key进行修改)
    mapVar[4] = “D”;
    mapVar[5] = “G”;
    mapVar[5] = “E”;
    上面的四种插入方法,只有第四种可以覆盖修改已有值,而其余三种插入相同key的时候会插入失败,那么我们如何判断是否插入成功,通过阅读源码我们发现map的insert方法会有个返回值,返回一个pair类型的对象,该pair的key为当前存入的位置的迭代器,value为是否存入成功,不管存入成功失败,返回的key迭代器都会指向当前要存入的位置:
    pair::iterator, bool> result = mapVar.insert(map::value_type(13, “F”));
    if (result.second) {
    cout << “插入成功” << endl;
    } else {
    cout << “插入失败” << endl;
    }
    //通过返回的结果拿到当前位置的迭代器进行后续遍历
    for (map::iterator it = result.first; it != mapVar.end(); it++) {
    cout << “(“ << it->first << “,” << it->second.c_str() << “)” << “\t”;
    }
    cout << endl;

    修改 mapVar[key] = new_value

    目前修改就是通过map的下标key赋值新的值即可覆盖 mapVar[3] = “FFF”;

    查找 find

    map的查找方法,使用的是find方法,该方法返回一个迭代器,如果迭代器被指向了map的end位置,则意味着没有查找到内容,否则即为查找到的目标位置:
    map::iterator findResult = mapVar.find(5);
    if (findResult != mapVar.end()) {
    cout << “查找到数据:(“ << findResult->first << “,” << findResult->second.c_str() << “)” << endl;
    } else {
    cout << “没有查找到数据!” << endl;
    }

    删除 erase

    这个简单的说就是通过map.erase(key)、map.erase(iterator迭代器)进行删除操作

    遍历 迭代器

    map::iterator it = mapVar.begin(); //获得起始位置迭代器
    it++; //往后移动迭代器
    it != mapVar.end(); //迭代器没有移出末端
    it.first(); //当前迭代器获得key值
    it.second(); //当前迭代器获得value值
    //遍历
    for (map::iterator it = mapVar.begin(); it != mapVar.end(); it++) {
    cout << “(“ << it->first << “,” << it->second.c_str() << “)” << “\t”;
    }
    cout << endl;

multimap

基本内容

多重map容器,该容器的特点是相对于map进行了变化
key可重复
不同的key会排序,但是相同key按照存入顺序排列