STL容器用法详解及注解(持续更新)

Posted cantredo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL容器用法详解及注解(持续更新)相关的知识,希望对你有一定的参考价值。

写在前面

以下摘录自wiki

STL又称标准模板库,是一个c++软件库,其中包含4个组件,分别为:

  • 算法
  • 容器
  • 函数
  • 迭代器

STL将“在数据上的操作”与“要执行操作的数据分开”,分别以如下概念指代:

  • 容器:包含、放置数据的地方。
  • 迭代器: 在容器中指出一个位置、或成对使用以划定一个区域,用来限定操作所涉及到的数据范围。
  • 算法: 要执行的操作。

总而言之,STL在编程的方方面面都有着巨大的作用,接下来将介绍常用的STL以及用法。

容器

Vector向量容器

Vector向量容器可在尾端插入或者删除元素,可动态调整所占用的内存空间,可以将其看作是以顺序结构实现的线性表。vector可以保存任意类型的变量,包括用户自定义的数据类型。

包含头文件

#include <vector>

定义

vector<T> vec ;

增加或者删除元素

  • vec.push_back(elem) –增加元素到vector容器的尾端
  • vec.pop_back(elem) –删除尾端元素
  • vec.insert(it,elem) –在迭代器it指向的元素前插入某一元素
  • vec.insert(it,n,elem) –在迭代器it指向的元素前插入n个元素
  • vec.erase(it) –删除迭代器it指向的元素
  • vec.erase(begin_it,end_it) –删除区间 [begin_it,end_it) 的元素
  • vec.clear() –清空全部元素

访问元素

  • vec[i] –访问索引值为i的元素
  • vec.front() –返回vec第一个元素
  • vec.back() –返回vec最后一个元素

获取当前长度或者当前容量

  • vec.size() –返回vec当前的长度
  • vec.empty() –若为空返回true否则为false

迭代器

  • vector<T>::iterator it –定义一个T数据类型的正向迭代器it
  • Vector<T>::reverse_iterator it –定义一个T数据类型的反向迭代器it

使用举例

#include <iostream>
#include <vector>

//STL组件属于std名称空间,以下不再赘述
using namespace std ;

int main(){
    cout << "enter the number of element:" << endl ;
    int num ;
    cin >> num ;
    if ( num == 0 ){
        cout << "please enter again" << endl ;
        cin >> num ;
    }

    //定义一个数据类型为 int 的 vector 容器 vec
    vector<int> vec ;
    for ( int i = 0 ; i < num ; i ++ ){
        cout << "input: " ;
        int number ;
        cin >> number ;
        //将元素添加至表尾
        vec.push_back(number) ;
    }

    //定义一个正向迭代器 it
    vector<int>::iterator it ;
    //定义一个反向迭代器 rit
    vector<int>::reverse_iterator rit ;
    cout << endl << "output:" << endl ;
    //正向输出
    cout << "in order: " << endl ;
    for ( it = vec.begin() ; it != vec.end() ; it ++ ){
        cout << *it << " " ;
    }
    cout << endl ;
    //反向输出
    cout << "reverse order: " << endl ;
    for ( rit = vec.rbegin() ; rit != vec.rend() ; rit ++ ){
        cout << *rit << " " ;
    }
    cout << endl << endl ;

    //插入操作
    cout << "insert:(position , element)" << endl ;
    int pos , element ;
    cin >> pos >> element ;
    if ( pos < 0 || pos > vec.size() ){
        cout << "please enter position again" << endl ;
        cin >> pos ;
    }
    vec.insert(vec.begin() + pos , element) ;
    cout << "there are *" << vec.size() << "* numbers now" << endl ;
    cout << "output:" << endl ;
    for ( it = vec.begin() ; it != vec.end() ; it ++ ){
        cout << *it << " " ;
    }
    cout << endl << endl ;

    //删除操作
    cout << "erase:(begin , end)" << endl ;
    int first , last ;
    cin >> first >> last ;
    if ( first < 0 || last > vec.size() ){
        cout << "please enter again" << endl ;
        cin >> first >> last ;
    }
    vec.erase(vec.begin() + first , vec.begin() + last) ;
    if ( !vec.empty() ){
        cout << "there are *" << vec.size() << "* numbers now" << endl ;
        for ( it = vec.begin() ; it != vec.end() ; it ++ ){
            cout << *it << " " ;
        }
    }else{
        cout << "the vector is empty now!" << endl ;
    }
    cout << endl ;
    return 0 ;
}

写在最后

本篇文章进行过程中参考了大量资料,对wiki贡献者以及各博主对天性愚钝的我给予知识上的补充表示深深的感谢。

以上是关于STL容器用法详解及注解(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章

STL —— multimap的用法详解

记一些stl的用法(持续更新)

深度解析C++ STL容器vector原理及用法

STL map&set用法详解

STL map&set用法详解

C++ STL容器+结构体+一些常用函数(持续更新)