【2019暑假刷题笔记-STL绪论】总结自《算法笔记》

本文详细介绍了C++标准模板库(STL)中的四种常用容器:vector、set、string和map的使用方法,包括定义、元素访问、插入、删除、查找等功能,适合初学者快速掌握STL容器的基本操作。

目     录

一、vector的常见用法

二、set的常见用法 

三、string的常见用法

四、map的常见用法


一、vector的常见用法

vector是一种可变长数组,常用于使用vector通过邻接表存储图;它本身也可以当作数组使用,在一些元素不确定的时候可以很好的节省空间。 

vector<vector<int> > a;
a.resize(m);//行数为m
for(int i=0;i<m;i++)//每行列数为n
    a[i].resize(n);
//之后可采用遍历的方式为a数组赋值
int t;
for(int i=0;i<m;i++)
{
    for(int j=0;j<n;j++)
        a[i][j]=t;
}

/*也可以这样*/
vector<int> a[100];//可以理解为100行,行中的元素自己push_back();

a[i].push_back(x);

 

  1. vector的定义:vector<typename> name  ||  ex. vector<int> name。二维数组表示
  2. vector内元素的访问:(1) 通过下标访问,ex. vi[index];(2) 使用迭代器访问
    /*
    迭代器的定义:vector<int>::iterator it
    迭代器迭代数组开始标志:it.begin()+i            其效果和vi[i]一致
    迭代器迭代数组结束标志:it.end()           其指的是数组最后一个元素后面的那个,不存在任何元素
    begin()和end()是左闭右开的思考来做的
    一般来说使用迭代器做循环是
    for(vector<int>::iterator it=vi.begin();it!=vi.end;i++)
        printf("%d",*(it+i))   只有vector和string容器可以这么做,其他只能用*it(在循环条件中it++)
    */
    

     

  3.  push_back()函数:

    /*
    使用方式:
    vi.push_back(x);
    把x的值放在vector类型数组vi数组最后面
    */

     

  4. pop.back()函数:

    /*
    使用方式:
    vi.pop_back(x);
    可以删除vector的尾元素x
    */

     

  5. size()函数: 

    /*
    使用方式:
    vi.size();
    获得vector中元素的个数
    */

     

  6. clear()函数:

    /*
    使用方法:
    vi.clear();
    将vi数组清空
    */

     

  7.  insert()函数:

    /*
    使用方法:
    vi.insert(it,x);
    例如:
    vi.insert(vi.begin()+2,-1);
    把-1插到vector数组的第2个位置,其后面所有数字后移一位
    */

     

  8. erase()函数:

     
    /*
    两种使用办法
    
    (1)vi.erase(it);
       删除单个元素,例如vi.erase(it.begin()+3);删除vi中第4个元素,同时后面的元素向前移动一位。
    
    (2)vi.erase(vi.begin()+1,vi.begin()+4);
        删除选定区间中的所有元素,ex.中为删除vi[1],vi[2],vi[3],左闭右开思想。后面的元素向前移3位
    
    */

     

二、set的常见用法 

set是一种内部自动升序排列且不含重复元素的容器,也就是一个有序的集合。适用于要求去重且不方便开数组的情况。

  1. set的定义:set<typename> name
  2. set内元素的访问:
    /*
    和vector一样的是,set容器的迭代定义依旧是set<typename>::iterator it
    不同的是:不能使用*(it+i)了
    */
    for(set<int>::iterator it=st.begin();it!=st.end();it++)
        printf("%d",*it);

     

  3. insert()函数:
    st.insert(x);//将x插入st中

     

  4. find()函数:
    set<int>::iterator it=st.find(x)  //在st中寻找一个x元素

     

  5. erase()函数:
    /*
    删除单个元素的形式
    1 st.erase(x);  //删除元素x
    2 st.erase(st.find(x))  //删除元素x
    
    
    删除一个区间的所有元素
    1 st.erase(first,last)
    2 st.erase(it,st.end());
    */

     

  6. size()函数:
    st.size();//得到st的元素个数
    

     

  7. clear()函数:
    st.clear();//清除set所有元素

     

三、string的常见用法

string用来存储字符串,存储的字符串也可以通过c_str()函数转化为字符数组,如

string str="abcd";
printf("%s\n",str.c_str());
/*否则需要cin,cout输入输出,二者都在#include <iostream>中*/

同时#include <string>和#include <string.h>是不一样的,前者是STL的容器,后者则是C语言的头文件。

  1. string的定义:
    /*定义*/
    string str;
    /*初始化定义*/
    string str="abcd";

     

  2. string中内容的访问:
    /*访问方式*/
    /*下标访问法,同字符数组类似*/
    printf("%c",str[i]);
    
    /*迭代器访问法,格式与set,vector等不同,不需要typename,因为string只有字符型*/
    string::iterator it;
    for(string::iterator it=str.begin();it!=str.end();it++){
        printf("%c",*it);
    }
    

     

  3. string类型字符串的拼接和比较:
    /*字符串拼接*/
    string str1="abc",str2="def",str3;
    str3=str1+str2;
    
    /*字符串的比较*/
    if(str1 < str2)  ...
    if(str1 != str2)  ...
    if(str1 >= str2)  ...

     

  4. length()/size()函数:
    /*返回string的长度*/
    string str="abcxyz",str="opq";
    printf("%d %d",str.length(),str.size());

     

  5. insert()函数:
    /*insert()函数两种插入办法*/
    /*str.insert(pos,string),pos表示插入的位置,string表示要插入的字符串*/
    string str="abcdef",str2="opq";
    str.insert(3,str2);
    /*得到abcopqdef*/
    
    
    /*str.insert(it,it2,it3) it是欲插入的位置,it2,it3是待查字符串的首尾迭代器*/
    str.insert(str.begin()+3,str2.begin(),str.end())
    /*表示在str的第三个位置插入str2整个字符串*/

     

  6. erase()函数 :
    /*erase()函数删除一个元素*/
    str.erase(str.begin()+4);
    
    /*erase()函数删除一个区间的元素有两种方式*/
    
    /*第一种:str.erase(first,last);*/
    str.erase(str.begin()+2,str.end()-1);
    
    
    /*第二种:str.erase(pos,length);从pos开始删除length个元素*/
    str.erase(3,2);

     

  7. clear()函数:
    /*清除字符串*/
    str.clear();

     

  8. substr()函数:
    /*substr(pos,length);返回从pos个字符及之后length-1个字符,即返回字符串*/
    string str="helloworld";
    str.substr(3,4);
    /*得到lowo的字符串*/

     

  9. string::npos:
    /*表示-1或者4294967295,一般和str.find()联用,如果find(x)==string::npos,表示找到不到*/

     

  10. find()函数:
    /*两种str.find()方式,返回第一次出现的位置*/
    
    /*str.find(str)*/
    if(str.find(str)!=string::npos) ...
    /*表示找到了,反之表示没找到*/
    
    
    /*str.find(str,7)*/
    if(str.find(str,7)!=string::npos) ...
    /*表示找到了,反之表示没找到*/

     

  11. replace()函数:
    /*两种replace()方式*/
    
    /*str.replace(pos,len,str2); 把str从pos号位开始,长度为len的字串替换为str2*/
    
    /*str.replace(it,it2,str2); 把str从it号位开始到it2号位的前一位(左闭右开原则)替换为str2*/

     

四、map的常见用法

map是可以将任何基本类型映射到任何基本类型的容器。需要#include <map>头文件和using namespace std;如map<char,int> mp;(是将字符型映射为整型)  map<string.int> mp(将字符串映射为整型),不使用map容器按数组的定义只能将int型映射为其他类型。

map的常见用途是:需要建立字符(或者字符串)与整数之间映射关系之间的题目,使用map可以减少代码量;判断打证书或者其他类型数据是否存在的时候,可一件map当做bool使用;字符串和字符串的映射也有可能遇到。

  1. map的定义:
    /*map容器定义不同与其他容器,其容器定义如下*/
    
    map<typename,typename> mp; 
    /*
    第一个typename表示key,第二个typename表示value,如
    map<char,int> mp;
    */

     

  2. map容器内元素的访问:
    /*map容器内元素的访问有两种方式*/
    
    /*第一种是下标访问*/
    mp['a']=1;
    printf("%d",mp['a']);
    
    /*第二种是使用迭代器访问*/
    mp['m']=1;
    mp['n']=2;
    for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
        printf("%c %d",it->first,it->second);
    
    /*在第二个例子中it->first指向key,it->second指向value,且map会以key的值从小到大的顺序自动排序,和set容器自动排序一样,采用红黑树实现*/

     

  3. find()函数:
    /*find(key)返回值为key的映射的迭代器*/
    mp.find('a');

     

  4. erase()函数:
    /*erase()函数有两种使用方法,即删除单个元素(有两种办法,时间复杂度不同)和删除一个区间内所有元素*/
    
    /*使用迭代器删除单个元素,时间复杂度为O(1)*/
    map<char,int>::iterator it=mp.find('a');
    mp.erase(it);
    
    /*使用key删除单个元素,时间复杂度为O(logN)*/
    map.erase('a');
    
    /*删除一个区间内所有元素,mp.erase(first,last);还是遵循左闭右开原则*/
    map<char,int>::iterator it_first=mp.find('a');
    map<char,int>::iterator it_last=mp.find('c');
    mp.erase(it_first,it_last);
    

     

  5. size()函数:
    /*map容器内的映射对数*/
    mp.size();

     

  6. clear()函数:
    /*清除map容器中所有元素的函数*/
    mp.clear();

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_之桐_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值