zoukankan      html  css  js  c++  java
  • set容器

    set容器简介:

    1) set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列元素插入过程是按排序规则插入,所以不能指定插入位置。

    2) set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。

    3) set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。

    4) multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次

    5) 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。

    (红黑树的变体,查找效率高,插入不能指定位置,插入时自动排序)

    set/multiset对象的默认构造

    set<int> setInt;            //一个存放int的set容器。

    set<float> setFloat;     //一个存放float的set容器。

    set<string> setString;     //一个存放string的set容器。

    multiset<int> mulsetInt;            //一个存放int的multi set容器。

    multi set<float> multisetFloat;     //一个存放float的multi set容器。

    multi set<string> multisetString;     //一个存放string的multi set容器。

    set的插入与迭代器

    set.insert(elem);     //在容器中插入元素。

    set.begin();  //返回容器中第一个数据的迭代器。

    set.end();  //返回容器中最后一个数据之后的迭代器。

    set.rbegin();  //返回容器中倒数第一个元素的迭代器。

    set.rend();   //返回容器中倒数最后一个元素的后面的迭代器。

    set的大小

    set.size();    //返回容器中元素的数目

    set.empty();//判断容器是否为空

    set的删除

    set.clear();            //清除所有元素

    set.erase(pos);   //删除pos迭代器所指的元素,返回下一个元素的迭代器。

    set.erase(beg,end);        //删除区间[beg,end)的所有元素    ,返回下一个元素的迭代器。

    set.erase(elem);     //删除容器中值为elem的元素。

    set的查找

    set.find(elem);   //查找elem元素,返回指向elem元素的迭代器。

    set.count(elem);   //返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1。

    set.lower_bound(elem);  //返回第一个>=elem元素的迭代器。

    set.upper_bound(elem);       //  返回第一个>elem元素的迭代器。

    set.equal_range(elem);        //返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。

    注:以上函数返回两个迭代器,而这两个迭代器被封装在pair中。

    pair的使用

    pair译为对组,可以将两个值视为一个单元。

    pair<T1,T2>存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。

    pair.first是pair里面的第一个值,是T1类型, pair.second是pair里面的第二个值,是T2类型。

    eg: 

    set<int> setInt;

    ...  //往setInt容器插入元素1,3,5,7,9

    pair< set<int>::iterator , set<int>::iterator > pairIt = setInt.equal_range(5);

    set<int>::iterator itBeg = pairIt.first;

    set<int>::iterator itEnd = pairIt.second;

    //此时 *itBeg==5  而  *itEnd == 7

    示例:

    /* set集合 元素唯一 自动排序 不能按照数组的方式插入元素红黑树*/
    class A
    {
    public:
    	int age;
    	string name;
    public:
    	A(int age, const char *name)
    	{
    		this->age = age;
    		this->name = name;
    	}
    	void print()
    	{
    		cout << name << " 对象的年龄是 " << age << endl;
    	}
    };
    
    //函数对象
    //重载了"()"操作符的普通类对象。从愈发上将。它与普通函数行为类似
    struct funcA
    {
    	bool operator()(const A &left, const A &right)
    	{
    		return (left.age < right.age);
    	}
    };
    
    int main()
    {
    	set<A, funcA> s1; //仿函数 函数对象
    	
    	A a1(10, "张三1");
    	A a2(30, "张三2");
    	A a3(8, "张三3");
    	A a4(20, "张三4");
    	A a5(20, "张三5");
    	
    	//typedef pair<iterator, bool> _Pairb
    	//如何判断insert函数返回值
    	s1.insert(a1);
    	s1.insert(a2);
    	s1.insert(a3);
    	pair<set<A, funcA>::iterator, bool> pair1 = s1.insert(a4);
    	if (pair1.second == true)
    		cout << "s4插入成功" << endl;
    	else
    		cout << "s4插入失败" << endl;
    	pair<set<A, funcA>::iterator, bool> pair2 = s1.insert(a5);
    	if (pair2.second == true)
    		cout << "s5插入成功" << endl;
    	else
    		cout << "s5插入失败" << endl;
    	
    	for (set<A, funcA>::iterator it = s1.begin(); it != s1.end(); it++)
    	{
    		cout << it->name << " 对象的年龄是 " << it->age << endl;
    		//it->print();
    	}
    	cout << endl;
    }
    
    int main1()
    {
    	//set<int> s1; //相当于 set<int, less<int> > s1 less就是仿函数 默认从小到大排列
    	
    	set<int, greater<int> > s1;
    	
    	s1.insert(11);
    	s1.insert(22);
    	s1.insert(13);
    	s1.insert(26);
    	s1.insert(13);
    	s1.insert(14);
    	s1.insert(24);
    	
    	//默认情况下 从小到大排列
    	for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
    			cout <<  *it << " ";
    	cout << endl;	
    	
    	cout << "set的大小是:" <<s1.size() << endl;
    	while (!s1.empty())
    	{
    		set<int>::iterator it = s1.begin(); 
    		cout << "set的头部元素是:" << *it << endl;
    		s1.erase(it); //删除
    	}
    	
    	return 0;
    }
    
    int main2()
    {
    	set<int> s1;
    	
    	for (int i = 5; i < 15; i++)
    		s1.insert(i);
    
    	for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
    			cout <<  *it << " ";
    	cout << endl;
    	
    	set<int>::iterator it1 = s1.find(11);
    	cout << "it1: " << *it1 << endl;
    	
    	cout << "出现5的个数num: " << s1.count(10) << endl;
    	
    	//小于10的元素的迭代器的位置
    	set<int>::iterator it2 = s1.lower_bound(10);
    	cout << "it2: " << *it2 << endl;
    	for (set<int>::iterator it = s1.begin(); it != it2; it++)
    			cout <<  *it << " ";
    	cout << endl;
    	
    	//大于10的元素的迭代器的位置
    	set<int>::iterator it3 = s1.upper_bound(10);
    	for (; it3 != s1.end(); it3++)
    			cout <<  *it3 << " ";
    	cout << endl;
    	
    	//s1.erase(11); //删除元素
    	pair<set<int>::iterator, set<int>::iterator>  mpair = s1.equal_range(11);
    	cout << "左:" << *mpair.first << "  右: " << *mpair.second << endl;
    	
    	return 0;
    }
  • 相关阅读:
    剑指 Offer——13. 调整数组顺序使奇数位于偶数前面
    剑指 Offer——3. 从尾到头打印链表
    剑指 Offer——2. 替换空格
    剑指 Offer——1. 二维数组中的查找
    LeetCode 905. Sort Array By Parity 按奇偶校验排列数组
    LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
    SSH 代码笔记
    anaconda3安装caffe
    opencv多版本安装
    人脸文章与数据库
  • 原文地址:https://www.cnblogs.com/porkerface/p/11419562.html
Copyright © 2011-2022 走看看