zoukankan      html  css  js  c++  java
  • STL学习笔记(十二) 关联式容器共性

     关联式容器共性: 

    1 关联式容器包括:

    set multiset map multimap  


    2 关联式容器共性:

    关联式容器l除了可以使用标准容器共性外 还拥有以下关联容器共性:

    实质都是红黑树,都自动根据key排序

     set<K>  multiset<K>   map<K,V> multimap<K,V>
     
    查找: .find(key) 返回一个迭代器,指向找到的第一个元素 失败返回.end()
    查找速度非常快 lgN

    统计: .count(key) 统计 关键字等于key的元素 的个数
    删除: .erase(key)  删除 关键字等于key的 所有元素
    区间: .lower_bound(key) 取得关键字为key的第一个元素位置
      .upper_bound(key)取得关键字为key的最后一个元素之后的位置

      .equal_range(key) 一次取得关键字为key的元素的区间 返回一个pair


    插入: insert(element)  // 不需要写位置,容器自动放在该放的位置

    构造函数可以用比较函数作为参数,默认是使用小于

    bool  (*compare)(K a,K b) { }


    必须对key支持小于运算符,否则没法插入


    3 关联容器示例:

    #include <iostream>
    #include <set> //头文件也是set
    using namespace std;
    #include "show.h"
    struct Person
    {
    	string name; //公有
    	int age;
    public:
    	Person(const char *name,int a):name(name),age(a){}
    	
    };
    
    //在关联式容器中  容器内容一定要能支持 < 符号
    bool operator<(const Person &a, const Person &b)
    {
    	return a.age<b.age || (a.age==b.age && a.name < b.name);
    }
    
    ostream& operator<<(ostream& o,const Person &p)
    {
    	return o << p.name << ':' << p.age;
    }
    
    int main()
    {
    	multiset<Person>  mp;
    	mp.insert(Person("cj",23));
    	mp.insert(Person("zyh",24));
    	mp.insert(Person("jack",25));
    	mp.insert(Person("kk",22));
    	mp.insert(Person("lll",26));
    	mp.insert(Person("jack",25));
    	mp.insert(Person("lll",26));
    	mp.insert(Person("lll",26));
    	mp.insert(Person("jack",25));
    	mp.insert(Person("lll",26));
    	show(mp.begin(),mp.end());
    	
    	
    	//查找
    	
    	//迭代器一定要带类型
    	multiset<Person>::iterator it =  mp.find(Person("zyh",24));
    	//find  比较相等时与 < 比较的内容相关 
    	//比如之前我在operator < 中只比较了年龄,find中找到的是年龄相同的
    	if( it == mp.end() )
    	{
    		cout << "没有找到zyh" << endl;
    	}
    	else
    	{
    		cout  <<  "发现目标" << *it << endl;
    	}
    	
    	
    	// 统计个数
    	it = mp.find(Person("jack",25));
    	cout << mp.count(*it) <<  "个" << *it <<endl; //3
    	
    	it = mp.find(Person("lll",26));
    	cout << mp.count(*it) << "个" << *it <<endl;//4
    	
    	//范围 上下界
    	multiset<Person>::iterator ib,ie;
    	ib = mp.lower_bound(Person("jack",25));
    	ie = mp.upper_bound(Person("jack",25));
    	
    	cout << "===================" << endl;
    	show(ib,ie); //输出 jack:25 jack:25 jack:25  主要是因为树自动将值进行了排序,相同的都放在一起
    	
    	typedef multiset<Person>::iterator Iter; 
    	pair< Iter,Iter> q = mp.equal_range(Person("lll",26)); //pair不用头文件
    	show(q.first,q.second); //lll:26 lll:26 lll:26 lll:26 
    
    	
    	cout << "======================" << endl;
    	mp.erase(Person("jack",25)); //删除
    	show(mp.begin() , mp.end() );
    	
    	
    }






  • 相关阅读:
    Linux下监视GPU、CPU的使用情况
    2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)
    2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
    2014多校第一场D题 || HDU 4864 Task (贪心)
    2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)
    2014多校第一场A题 || HDU 4861 Couple doubi
    POJ 2948 Martian Mining(DP)
    POJ 2029 Get Many Persimmon Trees(DP||二维树状数组)
    POJ 3280 Cheapest Palindrome(DP)
    POJ 4044 Score Sequence
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3091594.html
Copyright © 2011-2022 走看看