zoukankan      html  css  js  c++  java
  • C++的STL介绍

    vector的定义:vector<typename> name;//可变长的数组

    vector<int> array_int;

    vector<double> array_double等等

    struct node

    {

               ...................

    }

    vector <node> array_node//结构体数组

    vector的数组定义 vector<int> array_int[size]//这样array_int[0]-----array_int[size-1]都是一个vector的容器

    vector容器内容的访问

    1)通过下标访问,就像访问数组一样。

    2)通过迭代器访问                   迭代器可以理解为一种类似于指针的东西

    vector <int>::iterator it

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
    	vector <int> array_int;
    	int num;
    	for(int i=1;i<=5;i++)
    	{
    		cin>>num;
    		array_int.push_back(num);
    	}
    	vector<int>::iterator it;
    	for(it=array_int.begin();it!=array_int.end();it++)//通过迭代器访问 
    	cout<<*it<<endl;
    	int len=array_int.size();
    	for(int i=0;i<len;i++)//通过数组下标访问 
    	cout<<array_int[i]<<" "; 
    	return 0;
    } 
    

    vector的常用函数:

    push_back();//在最后面添加一个元素

    pop_back();//删除最后一个元素

    size();//返回一个长度值

    claer();//清空vector中的所有元素

    insert();//插入一个元素、

    insert(it,x);//在迭代器的it位置插入元素x

    erase()有两种用法:删除单个元素,删除一个区间内的所有元素

    1,删除单个元素erase(it)即删除迭代器为it处的元素

    2,erase(first,last)删除【first,last)区间内的所有元素

    #include <iostream>
    #include <stdio.h>
    #include <vector>
    using namespace std;
    int main()
    {
        vector<int> array_int;
        for(int i=1;i<=10;i++)
        array_int.push_back(i);//向vector数组内添加元素
        vector<int>::iterator it;//用迭代器的方法遍历输出vector数组 
        for(it=array_int.begin();it!=array_int.end();it++)
        cout<<*it<<" ";
        cout<<endl;
        array_int.pop_back();//删除最后一个元素
        for(it=array_int.begin();it!=array_int.end();it++)//再次输出查看结果 
        cout<<*it<<" ";
        cout<<endl;
        int len=array_int.size();//获取vector数组的长度
        cout<<len<<endl;
        array_int.clear();//清空数组
        cout<<array_int.size()<<endl;//结果应该为0
        
        //重新构建一个vector数组
        for(int i=1;i<=10;i++)
        array_int.push_back(i);
        vector<int>::iterator it1;
        for(it1=array_int.begin();it1!=array_int.end();it++)
        {
            if(*it1==6)//删除vector数组中的6
            {
                array_int.erase(it);
                break;
            }
         } 
        return 0;
    }

     

    set集合问题:

    set<typename> name;//这点和vector定义一样

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

    eg: set<int>::iterator it

    #include<iostream>
    #include <stdio.h>
    #include <set>
    using namespace std;
    int main()
    {
        set<int> st;
        st.insert(1);
        st.insert(3);
        st.insert(2);
        st.insert(5);
        st.insert(4);
        set<int>::iterator it;
        for(it=st.begin();it!=st.end();it++)//set具有自动排序(升序)元素唯一性的功能 
        cout<<*it<<" ";
        cout<<endl;
        set<int>::iterator it1;
        it1=st.find(2);//set的find()函数用法
        set<int>::iterator it2=st.find(60);//find(value)返回对应值的迭代器 
        cout<<*it1<<" "<<*it2<<endl;
        //erase();删除元素
        st.erase(2);//删除2
        set<int>::iterator it3;
        for(it3=st.begin();it3!=st.end();it3++)
        cout<<*it3<<" ";
        cout<<endl; 
        return 0;
    }

    map问题

    map<typename1,typename2> mp;

    map的访问可以是下标也可以是迭代器访问

    #include<iostream>
    #include<stdio.h>
    #include <map>
    using namespace std;
    int main()
    {
        map<char,int> mp;
        mp['a']=1;
        mp['b']=2;
        mp['c']=3;
        map<char,int>::iterator it;
        for(it=mp.begin();it!=mp.end();it++)//迭代器访问 
        cout<<it->first<<" "<<it->second<<endl;
        return 0;
    }

    map的实例解析:

    find(key)查找的功能

    erase()这个就不必多说了,删除功能,单个删除或者区间删除两种用法

    size()求长度

    clear()清楚map容器

    #include <stdio.h>
    #include <iostream>
    #include <map>
    using namespace std;
    int main()
    {
        map<char,int>mp;
        mp['a']=1;
        mp['b']=2;
        mp['c']=3;
        map<char,int>::iterator it=mp.find('b');//按照键的方式查找
        map<char,int>::iterator it1=mp.find('d');
        cout<<it->first<<" "<<it->second<<endl;//输出b 2
        cout<<it1->first<<" "<<it1->second<<endl;//输出的是乱码
        mp.erase('b');//删除key='b'的一组值
        map<char,int>::iterator it2;
        for(it=mp.begin();it!=mp.end();it++)
        cout<<it->first<<" "<<it->second<<endl;
        /*
            输出
            a 1
            c 3 
        */
        mp.clear();//将这个容器全部清空
        
        //下面补充的是关于map一组值的插入方式
        map<int,string>mp2;//学生的学号和姓名
        int num=1234;
        string name="byc";
        mp2.insert(pair<int,string>(num,name));//插入语法第一种 
        num=123;name="zyz";
        mp2.insert(map<int,string>::value_type(num,name));//插入语法第二种
        map<int,string>::iterator it3;
        for(it3=mp2.begin();it3!=mp2.end();it3++)//迭代器遍历输出 
        cout<<it3->first<<" "<<it3->second<<endl;
        /*
            输出 
            123 zyz
            1234 byc
            注意map有自动排序的功能 
        */ 
        return 0;
    } 

    priority_queue优先队列 

    priority_queue优先队列的队首元素一定是当前队列中优先级最高的一个。

    priority_queue<typename> name;//语法格式

    和队列不一样的是优先队列没有front()函数和把车开()函数,而只能通过top()函数来访问队首的元素,也就是优先级最高的元素

    常用函数实列

    push(x)入队

    top()队首

    pop()出队

    关于priority_queue内元素的优先级设置

    priority_queue<int>q

    priority_queue<int, vector<int>,less<int>> q所表达的意思相同

     less<int>表示数字越大优先级越大

    greater<int>表示数字越小优先级越大

    对于结构体的优先级设置

    struct node
    {
        string name;
        int price;
        friend bool operator < (node n1, node n2)
        {
            return n1.price<n2.price;//按照价格高的优先级越高
            //同样的如果变成价格低的优先级越高就变成n1.price>n2.price 
        }
     } 
    #include <stdio.h>
    #include <iostream>
    #include <queue>//priority_queue优先队列 
    using namespace std;
    struct stu
    {
        string name;
        int score;
        friend bool operator < (stu s1, stu s2)
        {
            return s1.score < s2.score;//分数高的优先级越高    
        }
    };//结构体优先级的相关问题 
    int main()
    {
        priority_queue<stu> q;
        stu t1,t2,t3;
        t1.name="byc";t1.score=100;
        t2.name="wj";t2.score=90;
        t3.name="lxg";t3.score=80;
        q.push(t1);//入栈
        q.push(t2);
        q.push(t3);
        cout<<q.top().name<<" "<<q.top().score<<endl;
        //输出 byc 100 
        return 0;    
    } 

    stack和queue

    讲到这队与栈的问题就相对简单一点了

    stack栈的问题

    #include <iostream>
    #include <stdio.h>
    #include <stack>
    using namespace std;
    int main()
    {
        stack<int> s1;
        s1.push(1);//入栈
        s1.push(2);s1.push(3);s1.push(4);s1.push(5);s1.push(6);
        while(!s1.empty())//判空,当时空的时候返回true
        {
            cout<<s1.top()<<" ";//取顶
            s1.pop();//出栈 
        
        }
        //输出 6 5 4 3 2 1 栈先进后出的法则 
        return 0;
    }
    #include <iostream>
    #include <stdio.h>
    #include <queue>
    using namespace std;
    int main()
    {
        queue<int> s1;
        s1.push(1);//入队
        s1.push(2);s1.push(3);s1.push(4);s1.push(5);s1.push(6);
        while(!s1.empty())//判空
        {
            cout<<s1.front()<<" ";//输出队首元素
            s1.pop();//抛出队首元素
            //s1.back()表示取队尾元素    
        }
        //输出的结果是 1 2 3 4 5 6 先进先出 
        return 0;    
    } 

    #include <algorithm>头文件

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int a[5]={1,2,3,4,5};
        
        reverse(a,a+5);//反转
        for(int i=0;i<5;i++)
        cout<<a[i]<<" ";
        cout<<endl;//输出 5 4 3 2 1 
        
        sort(a,a+5);//从小到大排序
        for(int i=0;i<5;i++)
        cout<<a[i]<<" ";
        cout<<endl;//输出 1 2 3 4 5 
        
        sort(a,a+5,greater<int>());//从大到小排序
        for(int i=0;i<5;i++)
        cout<<a[i]<<" ";//输出 5 4 3 2 1 
        return 0;
    }

    lower_bound  upper_bound的用法以及cmp函数

    不加比较函数的情况:

    int a[]={0,1,2,2,3};
    
    printf("%d
    ",lower_bound(a,a+5,2,cmp)-a);
    
     printf("%d
    ",upper_bound(a,a+5,2,cmp)-a)

    结果: 2   4

    lower的意义是对于给定的已经排好序的a,key最早能插入到那个位置

    0 1 | 2 2 3 所以2最早插入到2的位置

    upper的意义是对于给定的已经排好序的a,key最晚能插入到那个位置

    0 1 2 2 | 3 所以2最晚插入的位置是4

    加了比较函数:

    bool cmp(int a,int b)
    {
    return a<b;
    }
    int main()
    {
    
        int a[]={0,1,2,2,3};
        printf("%d
    ",lower_bound(a,a+5,2,cmp)-a);
        printf("%d
    ",upper_bound(a,a+5,2,cmp)-a);
        return 0 ;
    }

    结果仍然2  4 ,可以得出一个结论,cmp里函数应该写的是小于运算的比较

    如果加上了等号,lower和upper两个函数功能就刚好反过来了:

    bool cmp(int a,int b)
    {
    return a<=b;
    }
    int main()
    {
    int a[]={0,1,2,2,3};
    printf("%d
    ",lower_bound(a,a+5,2,cmp)-a);
    printf("%d
    ",upper_bound(a,a+5,2,cmp)-a);
    return 0 ;
    }

    结果 4 2

    next_permutation()//全排列

    排列(Arrangement),简单讲是从N个不同元素中取出M个,按照一定顺序排成一列,通常用A(M,N)表示。当M=N时,称为全排列(Permutation)。从数学角度讲,全排列的个数A(N,N)=(N)*(N-1)*...*2*1=N!,但从编程角度,如何获取所有排列?那么就必须按照某种顺序逐个获得下一个排列,通常按照升序顺序(字典序)获得下一个排列。

    下一个全排列(Next Permutation)

    对于给定的任意一种全排列,如果能求出下一个全排列的情况,那么求得所有全排列情况就容易了。好在STL中的algorithm已经给出了一种健壮、高效的方法。

    使用next_permutation

    如何获取所有全排列情况?STL中的代码非常精妙,利用next_permutation的返回值,判断是否全排列结束(否则将死循环)。对于给定的一个数组,打印其所有全排列只需如下:

    #include<iostream>
    #include <stdio.h>
    #include <bits/stdc++.h> 
    using namespace std; 
    int main()
    {
        int num[5];
        for(int i=1;i<=4;i++)
            num[i]=i;
        int ans=0;
        do//全排列 
        {
            for(int i=1;i<=4;i++)
                cout<<num[i]<<" ";
            cout<<endl;
            ans++;
        }while(next_permutation(num+1,num+1+4));
        cout<<ans<<endl;
        return 0;
    }

    fill()函数

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int a[5]={1,2,3,4,5};
        fill(a,a+3,111);//将前三个数对变成111;
        for(int i=0;i<5;i++)
        cout<<a[i]<<" ";//输出111 111 111 4 5
        //fill()函数的作用是将一定区间内的数组重新赋值 
        return 0;
    } 
     

    一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
  • 相关阅读:
    描述软件质量属性需求和质量属性场景(以淘宝网为例)
    软件架构初识
    机器学习实践02
    机器学习实践01
    机器学习十讲02
    用户故事与敏捷方法阅读笔记05
    机器学习十讲01
    用户故事与敏捷方法阅读笔记04
    tensorflow学习05(Mnist数据集)
    spring boot发送HTTP请求
  • 原文地址:https://www.cnblogs.com/byczyz/p/12154218.html
Copyright © 2011-2022 走看看