• C++标准模板库(STL)学习笔记


    一、vector(变长数组)

    1、使用vector

    #include <vector>
    using namespace std;
    

    2、vector的定义

    vector<int> vi;//定义了一个int型的长度可变的数组vi
    

    3、vector容器内元素的访问

    (1)通过下标访问
    for(int i=0;i<vi.size();i++){
    	cout<<vi[i]<<" ";
    }
    
    //遍历vector<vector<int>> vi
    for(int i=0;i<vi.size();i++){
    	for(int j=0;j<vi[i].size();j++){
    		cout<<vi[i][j]<<" ";
    	}
    	cout<<endl;
    }
    
    (2)通过迭代器访问(迭代器可以理解为一种类似指针的东西)
    vector<int>::iterator it=vi.begin();
    for(int i=0;i<vi.size();i++){
    	cout<<*(it+i)<<" ";
    }
    

    ​ 或者

    for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
    	cout<<*it<<" ";
    }//注意:vector的迭代器不支持it<vi.end()的写法
    

    4、vector的常用函数

    (1)push_back()

    ​ push_back(x)就是在vector后面添加一个元素x。

    (2)pop_back()

    ​ pop_back()用以删除vector的尾元素。

    (3)size()

    ​ size()用来获得vector中元素的个数。

    (4)clear()

    ​ clear()用来清空vector中的所有元素。

    (5)insert()
    vi.insert(vi.begin()+2,-1);//将-1插入vi[2]的位置
    
    (6)erase()
    //删除单个元素
    vi.erase(vi.begin()+3);//删除vi[3]位置上的元素
    
    //删除一个区间内的所有元素。erase(first,last)即删除[first,last)内的所有元素
    vi.erase(vi.begin()+1,vi.begin()+4);//删除vi[1]、vi[2]、vi[3]
    

    二、set(一个能进行自动递增排序且自动去除重复元素的集合)

    1、使用set

    #include <set>
    using namespace std;
    

    2、set的定义

    set<int> st;//定义了一个int型的名为st的集合
    

    3、set容器内元素的访问(set只能通过迭代器访问)

    for(set<int>::iterator it=st.begin();it!=st.end();it++){
    	cout<<*it<<" ";
    }//除开vector和string之外的STL容器都不支持*(it+i)的访问方式,因此只能按如上方式访问
    

    4、set的常用函数

    (1)insert()

    ​ insert(x)可将x插入set容器中,并自动递增排序和去重。

    (2)find()/count()
    set<int>::iterator it=st.find(2);//在set集合中查找值为2的元素,返回其迭代器(指针)
    st.count(2);//返回集合中2的个数
    
    (3)erase()
    //删除单个元素
    st.erase(st.find(100));//方法一:利用find()函数找到100的迭代器,然后用erase删除它
    st.erase(100);//方法二:直接删除set中值为100的元素
    //方法二写法简便,但时间复杂度更高
    
    //删除一个区间内的所有元素(左闭右开)
    set<int>::iterator it=st.find(30);
    st.erase(it,st.end());//删除>=30的元素
    
    (4)size()

    ​ size()用来获得set内元素的个数。

    (5)clear()

    ​ clear()用来清空set中的所有元素。

    三、string(字符串)

    1、使用string

    #include <string>
    using namespace std;
    

    2、string的定义(跟基本数据类型相同)

    string str;
    
    string str="abcd";
    

    3、string中内容的访问

    //可以像字符数组那样通过下标访问string
    string str="abcd";
    for(int i=0;i<str.length();i++){
    	cout<<str[i];//输出abcd
    }
    
    //读入和输出整个字符串
    string str;
    cin>>str;
    cout<<str;
    

    4、string的常用函数

    (1)+(可以将两个string直接拼接起来)
    string str1="abc",str2="xyz",str3;
    str3=str1+str2;//str3="abcxyz"
    str1+=str2;//str1="abcxyz"
    
    (2)两个string类型可以直接使用==、!=、<、<=、>、>=比较大小,比较规则是字典序
    (3)length()/size()
    string str="abcxyz";
    cout<<str.length()<<endl;
    cout<<str.size()<<endl;
    //均可以用来返回字符串的长度
    
    (4)insert()
    string str="abcxyz",str2="opq";
    str.insert(3,str2);//往str[3]位置处插入opq,使str="abcopqxyz"。这里str2的位置直接写"opq"也是可以的
    str.insert(0,"*");//使用insert()函数插入的必须要是字符串,所以要用双引号而不能用单引号
    
    (5)erase()
    //删除单个元素
    string str="abcdefg";
    str.erase(str.begin()+4);//删除了e
    
    //删除一个区间内的所有元素
    string str="abcdefg";
    str.erase(3,2);//删除从3号位开始的两个字符,即de
    
    (6)clear()

    ​ 清空字符串

    (7)substr()

    注意:substr()函数不会改变原字符串,而是返回一个新生成的子串。

    string str="thank you";
    cout<<str.substr(0,5)<<endl;//从0号位开始,截取长度为5的子串,即"thank"
    string str2="我abc们def";
    cout<<str2.substr(0,6)<<endl;//输出"我abc"。若截取的边界刚好卡在中文字符上,则自动不输出中文
    
    (8)find()

    ​ str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,则返回 string::npos。

    ​ str.find(str2,pos),从str的pos号位开始匹配str2,返回值与上述相同。

    (9)replace()

    ​ str.replace(pos,len,str2)把str从pos号位开始、长度为len的子串替换为str2。

    四、map(建立映射关系)

    1、使用map

    #include <map>
    using namespace std;
    

    2、map的定义

    map<string,int> mp;//建立了从字符串到整型的映射。键(key)的类型是string,值(value)的类型是int
    

    3、map容器内元素的访问

    (1)通过下标访问
    map<char,int> mp;
    mp['c']=20;//建立了键c到值20这样的一个映射关系
    mp['c']=30;//20被覆盖。map中的键是唯一的
    cout<<ma['c'];//输出30
    
    (2)通过迭代器访问
    map<char,int> mp;
    mp['m']=20;
    mp['r']=30;
    mp['a']=40;
    for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++){
    	cout<<it->first<<" "<<it->second;
    }//用it->first来访问当前映射的键,用it->second来访问当前映射的值
    
    //输出
    a 40
    m 20
    r 30
    //map会以键从小到大的顺序自动排序
    

    4、map的常用函数

    (1)find()
    map<char,int> mp;
    mp['a']=1;
    mp['b']=2;
    mp['c']=3;
    map<char,int>::iterator it=mp.find('b');//find(key)返回键为key的映射的迭代器
    cout<<it->first<<" "<<it->second;//输出:b 2
    
    (2)erase()
    //删除单个元素
    map<char,int>::iterator it=mp.find('b');
    mp.erase(it);//删除b 2
    //或者
    mp.erase('b');//删除键为b的映射,即b 2
    
    //删除一个区间内的所有元素
    map<char,int>::iterator it=mp.find('b');//令it指向键为b的映射
    mp.erase(it,mp.end());//删除it之后的所有映射,即b 2和c 3
    
    (3)size()
    map<char,int> mp;
    mp['a']=1;
    mp['b']=2;
    mp['c']=3;
    cout<<mp.size();//size()用来获得map中映射的对数,输出3
    
    (4)clear()
    mp.clear();//用来清空map中的所有元素
    

    五、queue(队列)

    1、使用queue

    #include <queue>
    using namespace std;
    

    2、queue的定义

    queue<int> q;
    

    3、queue容器内元素的访问

    cout<<q.front()<<" "<<q.back();//只能通过front()来访问队首元素,或是通过back()来访问队尾元素
    

    4、queue的常用函数

    (1)push()
    q.push(x);//将x入队列q
    
    (2)front()、back()

    ​ front()和back()可以分别获得队首元素和队尾元素。

    (3)pop()
    q.pop();//令队列q的队首元素出队
    
    (4)empty()

    ​ q.empty()检测队列q是否为空,q为空则返回true,q非空则返回false。

    (5)size()

    ​ q.size()用以返回队列q中元素的个数。

    六、stack(栈)

    1、使用stack

    #include <stack>
    using namespace std;
    

    2、stack的定义

    stack<int> st;
    

    3、stack容器内元素的访问

    cout<<st.top();//只能通过top()来访问栈顶元素
    

    4、stack的常用函数

    (1)push()
    st.push(x);//将x压入栈st中
    
    (2)top()
    st.top();//访问栈顶元素
    
    (3)pop()
    st.pop();//弹出栈顶元素
    
    (4)empty()

    ​ st.empty()可以检测stack内是否为空,栈空则返回true,栈非空则返回false。

    (5)size()

    ​ st.size()用以返回stack内元素的个数。

    七、algorithm头文件下的常用函数

    1、使用algorithm

    #include <algorithm>
    using namespace std;
    

    2、常用函数

    (1)max()、min()和abs()

    ​ max(x,y)和min(x,y)分别返回x和y中的最大值和最小值,且参数必须是两个(可以是浮点数)。如果想要返 回三个数x,y,z的最大值,可以使用max(x,max(y,z))的写法。

    ​ abs(x)返回x的绝对值。注意:x必须是整数。浮点型的绝对值请用math头文件下的fabs。

    (2)swap()

    ​ swap(x,y)用来交换x和y的值。

    (3)reverse()
    int a[10]={10,11,12,13,14,15};
    reverse(a,a+4);//将a[0]~a[3]反转,使数组a变成了{13,12,11,10,14,15}
    
    string str="abcdefghi";
    reverse(str.begin()+2,str.begin()+6);//对str[2]~str[5]反转,使字符串str变成了"abfedcghi"
    reverse(str.begin(),str.end());//将整个字符串反转,使字符串str变成了"ihgfedcba"
    
    (4)fill()
    int a[5]={1,2,3,4,5};
    fill(a,a+5,233);//将a[0]~a[4]均赋值为233
    
    (5)sort()
    //默认情况
    sort(a,a+4);//将数组a[0]~a[3]按从小到大排序
    sort(str.begin(),str.end());//将字符串str中的每个字符按从小到大排序
    sort(vi.begin(),vi.end());//将vector变长数组vi中的所有元素按从小到大排序
    
    //若想要实现从大到小的排序,则需要实现比较函数cmp
    bool cmp(int a,int b){
    	return a>b;
    }
    ……
    sort(a,a+4,cmp);
    ……
    //也可以使用greater<待排序元素的类型>()实现从大到小的排序
    sort(str.begin(),str.end(),greater<char>());//将字符串str中的每个字符按从大到小排序
    
    //结构体数组的排序
    struct node{
    	int x,y;
    }ssd[10];
    bool cmp(node a,node b){
    	return a.x>b.x;
    }//按x值从大到小对结构体数组排序
    
    bool cmp(node a,node b){
    	if(a.x!=b.x)
    		return a.x>b.x;
    	else
    		return a.y<b.y;
    }//先按x从大到小排序,但当x相等的情况下,按照y的大小从小到大来排序
    
    (6)lower_bound()和upper_bound()
    lower_bound(a,a+10,1);//返回a[0]~a[9]范围内第一个值>=1的元素的位置
    
    upper_bound(a,a+10,1);//返回a[0]~a[9]范围内第一个值>1的元素的位置
    
    (7)transform()函数
    transform(str.begin(),str.end(),str.begin(),::tolower);//将字符串str全部转化为小写
    transform(str.begin(),str.end(),str.begin(),::toupper);//将字符串str全部转化为大写
    
  • 相关阅读:
    实现 (5).add(3).minus(2) 功能
    vue兄弟组件传值的三种方法
    Web渗透测试思路整理
    PHP代码审计基础
    简单易用,用Powershell劫持Windows系统快捷键
    javascript脚本混淆
    秒杀系统架构优化思路
    什么是OOP
    一分钟了解负载均衡的一切
    MVC
  • 原文地址:https://www.cnblogs.com/jiajun107/p/12299050.html
Copyright © 2020-2023  润新知