zoukankan      html  css  js  c++  java
  • STL

    queue

    常用优先队列

    //升序队列,小顶堆
    priority_queue <int,vector<int>,greater<int> > q;
    //降序队列,大顶堆
    priority_queue <int,vector<int>,less<int> >q;
    

    (1)特点:
    只能访问容器的第一个和最后一个元素
    只能在容器的末尾添加新的元素
    只能从头部移出元素
    先进先出(FIFO,First in first out)

    (2)定义:
    queue<数据类型>名称;

    queue<int>q1;
    queue<char>q2;
    

    (3)函数
    back()返回最后一个元素
    empty()如果队列为空返回true
    front()返回队首元素
    pop()删除队首元素
    push()在末尾加入一个元素
    size()返回队列中元素的个数

    基本操作:

    q1.push(1);//向q1这个队列中插入1这个数字
    int len=q1.size();
    int a=q1.fount();
    

    pair

    pair就是一个结构体,但是比结构体更加灵活,一般使用typedef优化,
    pair<T1,T2>中T1和T2可以是不同的数据类型
    (1)定义

    pair<int,int>p1;
    pair<int,double>p2(1,2.5);    //定义的同时 还初始化了
    pair<int double>p3(p2);     //拷贝构造函数
    

    (2)访问:通过first和second

    p1.first=1;
    p1.second=2;
    cout<<p1.first<<" "<<p1.second<<endl;
    

    (3)赋值用make_pair

    pair<int,double>p4;
    p4 = make_pair(1,2.38);
    p5 = p4;     //变量间赋值
    

    (4)应用:
    如果一个函数有两个返回值 的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个
    struct ,但为了方便就可以使用 c++ 自带的pair ,返回一个pair,其中带有两个值。除了返回值的应用,在一个对象
    有多个属性的时候 ,一般自己写一个struct ,如果就是两个属性的话,就可以用pair 进行操作

    set集合


    (1)特点:
    set中元素是排好序的,从小到大(默认升序排列)
    set中没有重复元素

    (2)定义:
    //set<数据类型>名称;
    sets;

    (3)常用函数:

    s.begin();     //返回指向容器 最开始位置 数据的       ==指针==
    s.end();     //返回指向容器最后一个数据单元     ==+1的指针== 
    s.insert();     //插入
    s.clear();     //清空
    s.empty();     //判断set是否为空
    s.size();     //返回set中元素的个数
    s.erase();     //删除迭代器指针it处元素
    s.count(x)      //返回x出现的次数(因为是集合 只可能是0或1)
    

    注意:插入规则在默认的比较规则下,是按元素值从小到大插入,如果自己指定了比较规则函数,则按自定义比较规则函数插入。

    set<int>::iterator it; //定义前向迭代器
    set<int>::reverse_iterator rit; //定义反向迭代器
    

    看这两个代码:

    #include<iostream>
    #include<set>
    using namespace std;
    int main()
    {
    	set<int> s;
    	
    	s.insert(5); //第一次插入5,可以插入
    	s.insert(1);
    	s.insert(6);
    	s.insert(3);
    	s.insert(5); //第二次插入5,重复元素,不会插入
    	
    	set<int>::iterator it; //定义前向迭代器
    	//中序遍历集合中的所有元素
    	for(it = s.begin(); it != s.end(); it++)
    	{
    		cout << *it << " ";
    	}
    	//cout <<s.end()<< endl;报错
    	cout << endl;
    	return 0;
    }
    
    //运行结果:1 3 5 6
    

    第二个代码:
    (元素的方向遍历
    使用反向迭代器reverse_iterator可以反向遍历集合,输出的结果正好是集合元素的反向排序结果。
    它需要用到 rbegin()和rend() 两个方法,
    它们分别给出了反向遍历的开始位置和结束位置。)

    #include<iostream>
    #include<set>
    using namespace std;
    int main()
    {
    	set<int> s;
    	
    	s.insert(5); //第一次插入5,可以插入
    	s.insert(1);
    	s.insert(6);
    	s.insert(3);
    	s.insert(5); //第二次插入5,重复元素,不会插入
    	
    	set<int>::reverse_iterator rit; //定义反向迭代器
    	//反向遍历集合中的所有元素
    	for(rit = s.rbegin(); rit != s.rend(); rit++)
    	{
    		cout << *rit << " ";
    	}
    	cout << endl;
    	return 0;
    }
    
    //运行结果:6 5 3 1
    
    

    (4)元素的删除s.erase(键值);
    (5)元素的检索
    使用find()方法对集合进行检索,如果找到查找的的键值,则返回该键值的 迭代器位置 ;否则,返回集合最后一个元素后面的一个位置,即end()
    (6)自定义比较函数
    使用insert将元素插入到集合中去的时候,集合会根据设定的比较函数奖该元素放到该放的节点上去。在定义集合的时候,如果没有指定比较函数,那么采用 默认的比较函数,是按键值从小到大的顺序插入元素。但在很多情况下,需要自己编写比较函数。

    编写比较函数有两种方法。

    (1)如果元素不是结构体,那么可以编写比较函数。下面的程序比较规则为 按键值从大到小的顺序插入到集合中 。

    #include<iostream>
    #include<set>
    using namespace std;
    struct mycomp
    { 
        //自定义比较函数,重载“()”操作符
    	bool operator() (const int &a, const int &b)
    	{
    		if(a != b)
    			return a > b;
    		else
    			return a > b;
    	}
    };
    int main()
    {
    	set<int, mycomp> s; //采用比较函数mycomp
    	
    	s.insert(5); //第一次插入5,可以插入
    	s.insert(1);
    	s.insert(6);
    	s.insert(3);
    	s.insert(5); //第二次插入5,重复元素,不会插入
    	set<int,mycomp>::iterator it;
    	for(it = s.begin(); it != s.end(); it++)
    		cout << *it << " ";
    	cout << endl;
    	return 0;
    }
    
    /*
    运行结果:6 5 3 1  
    */
    

    (2)如果元素是结构体,那么可以直接把比较函数写在结构体内

    #include<iostream>
    #include<set>
    #include<string>
    using namespace std;
    struct Info
    {
    	string name;
    	double score;
    	bool operator < (const Info &a) const // 重载“<”操作符,自定义排序规则
    	{
    		//按score由大到小排序。如果要由小到大排序,使用“>”即可。
    		return a.score < score;
    	}
    };
    int main()
    {
    	set<Info> s;
    	Info info;
     
    	//插入三个元素
    	info.name = "Jack";
    	info.score = 80;
    	s.insert(info);
    	info.name = "Tom";
    	info.score = 99;
    	s.insert(info);
    	info.name = "Steaven";
    	info.score = 60;
    	s.insert(info);
     
    	set<Info>::iterator it;
    	for(it = s.begin(); it != s.end(); it++)
    		cout << (*it).name << " : " << (*it).score << endl; 
    	return 0;
    }
    
    /*
    运行结果:
    Tom : 99
    Jack : 80
    Steaven : 60
    */
    

    stack栈

    (1)特点:
    只能访问栈顶元素,
    插入删除只能在栈顶操作
    插入叫入栈,删除叫出栈
    后进先出

    (2)定义

    stack<int> s; //stack<数据类型> 名称;
    stack<double> s;
    

    (3)函数

    s.empty() //判断栈是否为空
    s.size() //返回栈中元素个数
    s.pop() //删除栈顶元素
    s.top() //返回栈顶元素但不删除该元素
    s.push(x) //在栈顶压入新元素
    
  • 相关阅读:
    Eclipse在线安装主题(color theme)以及安装color theme第三方主题(图文)
    eclipse快速打开文件目录
    获取项目路径
    阿里巴巴Druid数据源及使用
    project_online
    色区-论坛
    mysql密码
    jre变更目录或修改文件名后报错解决
    9个基于Java的搜索引擎框架
    面试参考
  • 原文地址:https://www.cnblogs.com/Arielzz/p/14211397.html
Copyright © 2011-2022 走看看