STL_set_集合

——————2018-4-14更新———————
set中判定一个元素是否存在除了用find, 还可以用count()函数
如果存在, 返回一, 如果不存在, 返回0. (元素的数量)

set的排序规则, 使用cmp结构体

#include <iostream>
#include <set>
using namespace std;

struct cmp {
    bool operator () (int x, int y) {
        return x > y;
    }
};

struct comp {
    bool operator () (string x, string y) {
        if(x.size() == y.size()) return x < y;
        else return x.size() < y.size();
    }
};

int main()
{
    set<int, cmp> s;
    for(int i = 0; i < 10; ++i) {
        s.insert(i);
    }
    set<int, cmp>::iterator it = s.begin();
    while(it != s.end()) {
        cout << *it << ' ';
        it++;
    }
    cout << endl;

    set<string, comp> str;
    str.insert("abc");
    str.insert("gh");
    str.insert("fhlsd");
    str.insert("z");
    set<string, cmp>::iterator is = str.begin();
    while(is != str.end()) {
        cout << *is << ' ';
        is++;
    }
    cout << endl;
}

erase()函数使用

有三种传递参数的方法

这里写图片描述

set中的交集, 并集, 差集, 对称差

使用方法全在下面代码
虽然参数有点多, 有点烦, 但仔细想想, 正是这么多这么细的参数, 才好实现这些函数的功能, 才能跟灵活的使用集合的运算
需要注意的是, 这些函数是包含在算法库里面的, 之前还以为就在set里面呢.

#include <set> 
#include <algorithm>  //注意, 这些函数是在算法库里的 
#include <iostream>
using namespace std;

int main()
{
    set<int> s1, s2, s3, s4, s5, s6, s7;
    for(int i = 0; i < 10; ++i) {
        s1.insert(i);
    }
    for(int j = 7; j < 16; ++j) {
        s2.insert(j);
    }

    //交集 
    set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s3, s3.begin()));
    set<int>::iterator it = s3.begin();
    while(it != s3.end()) {
        cout << *it << ' ';
        it ++;
    } 
    cout << endl;

    //并集 
    set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s4, s4.begin())); 
    it = s4.begin();
    while(it != s4.end()) {
        cout << *it << ' ';
        it ++;
    } 
    cout << endl;

    //差集1
    set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s5, s5.begin())); 
    it = s5.begin();
    while(it != s5.end()) {
        cout << *it << ' ';
        it ++;
    } 
    cout << endl;

    //差集2
    set_difference(s2.begin(), s2.end(), s1.begin(), s1.end(), inserter(s6, s6.begin())); 
    it = s6.begin();
    while(it != s6.end()) {
        cout << *it << ' ';
        it ++;
    } 
    cout << endl;

    //对称差
    set_symmetric_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s7, s7.begin())); 
    it = s7.begin();
    while(it != s7.end()) {
        cout << *it << ' ';
        it++;
    }
    cout << endl;
}

——————以上是更新————————–

set是C++STL中常用的容器, 意思是集合

和数学中的集合一样, 它的每一个元素都是唯一的, 即不存在相同的元素
set里元素排列是有顺序的, 默认为升序排序
和sort一样, 排序的规则可以自定义

常用的函数有:
begin()    返回set容器的第一个元素的地址

end()      返回set容器的最后一个元素地址

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

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

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

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

erase(it)      删除迭代器指针it处元素

find()      查找元素出现的位置, 如果出现返回迭代器, 如果不出现返回set.end();

使用代码示例1:

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set <int> s;
    for( int i = 10; i >= 0; --i ) {
        s.insert(i);
    }
    for(set<int>::iterator it = s.begin(); it != s.end(); ++it) {
        cout << *it << endl;
    }
    cout << "size = " << s.size() << endl;
    s.clear();
    cout << "size = " << s.size() << endl; 
    if(s.empty()) {
        cout << "now the set is empty!\n";
    }
    for( int i = 10; i >= 0; --i ) {
        s.insert(i);
    }
    set<int>::iterator ii = s.begin();
    s.erase(ii);
    for(set<int>::iterator it = s.begin(); it != s.end(); ++it) {
        cout << *it << endl;
    }
}

我在查资料的时候看到有博主提到count函数
这是算法库中的计数函数, 返回一个值在容器中出现的次数
包含在algorithm中
count(begin, end, value);

以及count_if函数, 自定义计数规则

示例2:

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#define random(a,b) rand()%(b+1-a) + a

using namespace std;

bool cmp(int n)
{
    if(n > 10) return 1;
    else return 0;
}

int main()
{
    srand(time(NULL));
    int a[100];
    for( int i = 0; i < 100; ++i ) {
        a[i] = random(1, 20); 
        cout << a[i] << ' ';
    }
    cout << endl;
    cout << count_if(a, a+100, cmp);
}

使用示例3:

#include <iostream>
#include <algorithm>
#include <set>

using namespace std;

int main()
{
    set<int>s;
    for( int i = 0; i < 20; ++i ) {
        s.insert(i%6);
    }
    cout << "size = " << s.size() << endl;
    set<int>::iterator it = s.begin();
    while(it != s.end()) {
        cout << *it << endl;
        it++;
    }
    cout << *s.find(4) << endl;
    if(s.find(6) == s.end()) {
        cout << "no such a number !\n";
    }
    cout << count(s.begin(), s.end(), 2) << endl;
    cout << count(s.begin(), s.end(), -1) << endl;
    cout << count(s.begin(), s.end(), 6) << endl;
}

参考资料1
参考资料2
参考资料3

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值