STL初步

[亡魂溺海] 提交于 2019-12-02 06:44:50

STL初步

1.排序与检索

algorithm头文件中的sort可以给任意对象排序,包括内置类型和自定义类型,前提是定义了“<”运算符。

排序之后可以用lower_bound查找大于或等于x的第一个位置。

待排序/查找的元素可以放在数组里,也可以放在vector里。

#include<algorithm>
#include<iostream>
#inlcude<cstdio>

using namespace std;
const int N=100;

//比较函数,降序排列
bool cmp(int x,int y)
{
    return x>y;
}

int main()
{
    int a[N];
    for(int i=0;i<N;i++)
        scanf("%d",&a[i]);
    
    //sort有三个参数,分别是数组首地址、尾地址,比较函数。比较函数可省略,默认为从小到大进行排序,即升序排列
    sort(a,a+N,cmp);
    //若数据存在vector中,则以sort(a.begin(),a.end())的方式调用。
    
    int x=5;
    //lower_bound有三个参数,分别是数组首地址、尾地址,和待查找元素
    int p=lower_bound(a,a+N,x);
        
}

2.不定长数组:vector

vector头文件中的vector是一个不定长数组,可以用clear()清空,size()读取它的大小,resize()改变大小,用push_back()和pop_back()在尾部添加和删除元素,用empty()测试是否为空。vector之间可以直接赋值或者作为函数的返回值。

vector是一个模板类,需要用``vector a或者vector b`的方式来声明一个vector

#include<cstdio>
#include<cstring>
#inlcude<vector>

using namespace std;
const int N=30;

int main()
{
    //声明int型的vector,相当于int a[];
    vector<int> a;
    
    //相当于一个二维数组,只是第一维大小是固定的(不超过N),但第二维的大小不固定
    vector<int> b[N];
    
    for(int i=0;i<N;i++)
    {
        //在b[i]尾部添加元素i,注意是b[i],而不是b,每个b[i]相当于一个vector
        b[i].push_back(i);
    }
    
    //保留下标0~N-10的元素
    b.resize(N-10);
    
    //b.size()为b一维的大小
    for(int i=0;i<b.size();i++)
        printf("%d",b[i][0]);
        
    return 0;
}

3.集合与映射

集合和映射也是两个常用的容器

set头文件中的set和map头文件中的map分别是集合与映射。

二者都支持insert、find、count和remove操作,并且可以从小到大的顺序循环遍历其中的元素。map还提供了”[]“运算符,是的map可以像数组一样使用。事实上,map也成为“关联数组”。

3.1 集合:set

set就是数学上的集合——每个元素最多出现一次。

和sort一样,自定义类型也可以构造set,但同样必须定义“小于”运算符。

set中元素已从小到大排好序

set常用操作:

  • begin() 返回set容器的第一个迭代器

  • end() 返回set容器的最后一个迭代器

  • clear() 删除set容器中的所有的元素

  • empty()   判断set容器是否为空

  • max_size()   返回set容器可能包含的元素最大个数

  • size()     返回当前set容器中的元素个数

  • rbegin    返回的值和end()相同

  • rend()    返回的值和begin()相同

  • insert() 插入元素

//安迪的第一个字典(Andy's First Dictionary,UVa 10815)
#include<cstdio>
#include<cstring>
#include<set>
#include<sstream>
#include<iostream>

using namespace std;

int main()
{
    //string集合
    set<string> dict;
    
    string s,buf;
    
    while(cin>>s)
    {
        for(int i=0;i<s.length();i++)
        {
            //isalpha()判断字符是否为字母的函数
            if(isalpha(s[i]))
            {
               //tolower()将字母变为小写的函数
                s[i]=tolower(s[i]);
            }
            else
                s[i]=' ';      
        }
        
        //字符串流
        stringstream ss(s);
        
        while(ss >> buf)
            dict.insert(buf);
                
    }
    
    //iterator是迭代器,用法类似于指针
    for(set<string>::iterator it=dict.begin();it!=dict.end();++it)
        cout<<*it<<"\n";
    
    return 0;
}

3.2 映射:map

map就是从键(key)到值(value)的映射。它重载了[]运算符,map像是数组的”高级版“。

map常用操作:

  • empty() 判断map容器是否为空

  • size() 返回当前map容器中元素个数

  • max_size() 用于返回当前容器可以存放的最大值

  • insert(key,value) 在map中插入元素

  • find(key) 获取元素的迭代器

  • count(key) 返回元素数目,因为映射关系的容器中所有元素都是唯一的,所以返回0或1

  • begin() 返回map容器的第一个迭代器

  • end() 返回map容器的最后一个迭代器

#include<iostream>
#include<map>

using namespace std;

int main()
{
    //声明map
    map<char,int> mymap;
    
    //直接给map赋值
    mymap['a']=10;
    mymap['b']=20;
    mymap['c']=30;
    mymap['d']=40;
    mymap['e']=50;
    mymap['f']=60;
    
    //判断mymap是否为空
    while(!mymap.empty())
    {
        cout<<mymap.begin()->first<<"=>"<<mymap.begin()->second<<"\n";
        mymap.erase(mymap.begin());
    }
    
    for(map<char,int>::iterator it=mymap.begin();it!=mymap.end();it++)
        cout << it->first << " => " << it->second << '\n';
    
    //在map中查找key 'c',并返回该元素的迭代器
    map<char,int>::iterator it=find('c');
    
    //通过迭代器删除元素
    mymap.erase(it);
    //通过key删除元素
    mymap.erase('b');
    
    it=find('d');
    //删除指定范围的元素
    mymap.erase(it,mymap.end());
    
    //插入元素
    mymap.insert(pair<char,int>('g',70);
    return 0;
}

4.栈、队列与优先队列

4.1 栈:stack

后进先出的数据结构

STL的stack头文件提供了栈,用stack<int> s方式定义,用push()和pop()实现元素的入栈和出栈操作,top()取栈顶元素(但不删除)。

常用操作:

  • empty() 判断栈是否为空
  • pop() 删除栈顶元素
  • push() 插入元素到栈顶
  • size() 返回栈中元素的个数
  • top() 返回栈顶元素
#include<iostream>
#include<stack>

using namespace std;

int main()
{
    //声明栈
    stack<int> mystack;
    
    //将元素压入栈
    for(int i=0;i<10;i++)
        mystack.push(i);
    
    //输出站长元素的个数
    cout<<mystack.size()<<endl;
    
    //判断栈是否为空
    while(!mystack.empty())
    {
        //输出栈顶元素
        cout<<mystack.top()<<' ';
        //删除栈顶元素
        mystack.pop();
    }
    
    return 0;
}

4.2 队列:queue

先进先出的数据结构

STL的queue头文件提供了队列,用queue<int> s方式定义,用push()和pop()进行元素的入队和出队,front()取队首元素(但不删除)。

常用操作:

  • back() 返回队尾元素

  • empty() 判断队列是否为空

  • front() 返回队首元素

  • pop() 删除队首元素

  • push() 在队尾插入元素

  • size() 返回队列中元素的个数

#include<iostream>
#include<queue>

using namespace std;

int main()
{
    //声明队列
    queue<int> myqueue;
    
    //将元素加入队列
    for(int i=0;i<10;i++)
        myqueue.push(i);
    
    //输出队列中元素的个数
    cout<<myqueue.size()<<endl;
    
    //判断队列是否为空
    while(!myqueue.empty())
    {
        //输出队首元素
        cout<<myqueue.front()<<' ';
        //删除队首元素
        myqueue.pop();
    }
    
    
    return 0;
}

4.3 优先队列:priority_queue

优先队列类似于队列,但先出队列的元素为队列中优先级最高的元素,即优先队列中的元素按照优先级进行排序,默认字典序越小优先级越低。

STL的queue头文件提供了优先队列,用priority_queue<int> s方式定义,用push()和pop()进行元素的入队和出队操作,top()取队首元素(但不删除)。

常用操作:

  • empty() 判断队列是否为空
  • size() 返回队列中元素的个数
  • top() 返回队首元素
  • push() 插入元素
  • pop() 删除队首元素
#include<iostream>
#include<queue>

using namespace std;

int main()
{
    //声明优先队列
    priority_queue<int> mypq;
    
    //将元素加入队列
    for(int i=0;i<10;i++)
        mypq.push(i);
    
    //判断队列是否为空
    while(!mypq.empty())
    {
        //输出队首元素
        cout<<mypq.top()<<' ';
        //删除队首元素
        mypq.pop();
    }
    
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!