STL set 整理

/*STL set集合*/
/*2015.05.24 11:29第一次整理*/
/* map和set的插入删除效率比用其他序列容器高——指针的变换*/
/*每次insert之后,以前保存的iterator不会失效——内存地址不变*/

/**/
/**/
#include <iostream>
#include <cstdio>
#include <set>
#include <string>

using namespace std;

typedef struct mycomp//基本元素排序函数
{
    //自定义从大到小的比较函数,重载()操作符,默认从小到大
    bool operator () (const int &a,const int & b)
    {
        return a > b;
    }
}cmp;

typedef struct STUDENT
{
    double score;
    string name;
    bool operator < (const STUDENT &a) const
    //重载小于号,按从大到小顺序排列
    {
        if(score != a.score)
        {
            return score > a. score;
        }
        else
        {
            return name > a.name;
        }
    }
}Info;

int main()
{
    set<int> s;
    set<int>::iterator sIte;
///插入
    s.insert(1);
    //返回值 pair<set<int>::iterator,bool>,bool判断是否成功,
    //迭代器为插入成功后的位置或者已经尊在的元素的位置
    s.insert(3);
    s.insert(7);
    s.insert(5);
    s.insert(3);//重复元素,不插入
    for(sIte = s.begin(); sIte != s.end(); ++sIte) //中序遍历
    {
        cout << *sIte << endl;//迭代器本质就是一个指针
    }
///反向遍历
    set<int>::reverse_iterator sIter;
    for(sIter = s.rbegin(); sIter != s.rend(); ++sIter)
    {
        cout << *sIter << endl;
    }
///删除(set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等)
    s.erase(3);//直接删除键值

    set<int>::iterator first,second;
    first = s.begin();
    second = s.begin();
    for(int i = 0;i < 2;i++)
    {
        second++;
    }//迭代器不支持“+”与“+=”操作符

    s.erase(second);
    cout << " " << *second << endl;//输出还是7,但是集合里面已经没有7这个元素,地址没有变

    s.erase(first,--second);//前闭后开的区间,且第二个参数必须是存在树结构中,否则first无法遍历到second位置
    s.insert(first,--second);//不懂用法

    for(sIter = s.rbegin(); sIter != s.rend(); ++sIter)
    {
        cout << *sIter << endl;
    }//输出1、5
///查找
    s.insert(1);
    s.insert(3);
    s.insert(7);
    s.insert(5);
    if(s.count(3))//计数函数,set中返回值只有0,1
    {
        cout << "find!count 值:" << s.count(3) <<endl;
    }
    else
    {
        cout << "do not find" << endl;
    }

    if((sIte = s.find(2)) == s.end())
    {
        cout << "do not find" << endl;
    }
    else
    {
        cout << "find :" << *sIte <<endl;
    }
///定位器
    //equal_range() 用法同map
    //lower_bound(key_value) ,返回第一个大于等于key_value的定位器
    //upper_bound(key_value),返回最后一个大于等于key_value的定位器
///判空、清空
    if(s.empty())
    {
        cout << "empty!"<< endl;
    }
    else
    {
        cout << "not empty" << endl;
    }
    s.clear();
///求大小
    cout << s.size() << endl;
    cout << s.max_size() << endl;//返回set容器可能包含的元素最大个数
///简单元素自定义比较函数
    set<int,cmp>mySet;
    mySet.insert(1);
    mySet.insert(3);
    mySet.insert(7);
    mySet.insert(5);
    for(sIte = mySet.begin(); sIte != mySet.end(); ++sIte)
    {
        cout << *sIte << endl;
    }//7,5,3,1
///结构体元素排序
    set<Info> stu;
    set<Info>::iterator sStuIte;
    Info temp;
    temp.name = "cainao";
    temp.score = 80;
    stu.insert(temp);
    temp.name = "sabi";
    temp.score = 85;
    stu.insert(temp);
    temp.name = "erhuo";
    temp.score = 80;
    stu.insert(temp);
    for(sStuIte = stu.begin();sStuIte != stu.end();++sStuIte)
    {
        cout << (*sStuIte).name << " " << (*sStuIte).score << endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值