set 排序_multiset与set的区别

multiset与set的区别:multiset支持重复,而set会去重

set相关知识

set和multiset的最大区别:set支持去重, multiset不支持。

set用法

1.基本操作

void run_case()
{
    set<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    //输出结果按照从小到大的顺序排序
    for (int x : s)
        cout << x << "n";
    cout << "n";
    s.erase(2);
    //删除一个元素,复杂度O(log(n))
    for (int x : s)
        cout << x << "n";
    //判断一个元素是否存在
    if (s.count(1))
        cout << "存在n";
    else
        cout << "不存在n";
}

输出结果

e65e3a7c69f6721d049bbfa59906884f.png

2.重载进行排序

struct node
{
    int x;
    int y;
};
//在 set 里面进行重载,和优先队列一样
bool operator<(const node &a, const node &b)
{
    if (a.x == b.x)
        return a.y < b.y;
    return a.x < b.x;
}
void run_case()
{
    set<node> s;
    s.insert(node{1, 1});
    s.insert(node{1, 1});
    s.insert(node{1, 2});
    s.insert(node{1, 3});
    s.insert(node{2, 2});
    s.insert(node{2, 3});
    for (auto t : s)
    {
        cout << t.x << " " << t.y << "n";
    }
}

输出结果:

926d38690272b4ad55f3d9888ee7211a.png

3.find函数的用法

void run_case()
{
    //返回迭代器位置如果没有找到返回值为最后一个元素的下一个位置,也就是end()
    set<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    auto it = s.find(2);
    cout << *it << "n";
}

输出结果:

3fb67f54a5535e25a6f92232a9258bab.png

4.迭代器的用法

void run_case()
{
    //返回迭代器位置如果没有找到返回值为最后一个元素的下一个位置,也就是end()
    set<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    auto it1 = s.begin();  //指向第一个元素
    auto it2 = s.rbegin(); //指向最后一个元素
    auto it3 = s.end();    //指向最后一个元素的下一个位置
    auto it4 = s.rend();   //指向第一个元素的前一个位置
    cout << *it1 << "n";
    cout << *it2 << "n";
    //cout << *it3 << "n";
    //cout << *it4 << "n";
    for (auto x : s)
        cout << x << " ";
    cout << "n";
    for (auto it = s.begin(); it != s.end(); it++)
        cout << *it << " ";
    cout << "n";
    for (auto it = s.rbegin(); it != s.rend(); it++)
        cout << *it << " ";
    cout << "n";
}

输出结果:

dd8a6a2985b07e89bf597d0d83e4fed0.png

multiset用法

mutiset和set的用法十分相似,主要在于multiset不可以去重,而set可以 我们把上面set的操作用multiset跑一遍,就可以看到不同了 1.基本操作

void run_case()
{
    multiset<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    //输出结果按照从小到大的顺序排序
    for (int x : s)
        cout << x << "n";
    cout << "n";
    s.erase(2);
    //删除一个元素,复杂度O(log(n))
    for (int x : s)
        cout << x << "n";
    //判断一个元素是否存在
    if (s.count(1))
        cout << "存在n";
    else
        cout << "不存在n";
}

运行结果:

d3c0649d09929372ee411ee1155ea300.png

2.重载进行排序

struct node
{
    int x;
    int y;
};
//在 multiset 里面进行重载,和优先队列一样
bool operator<(const node &a, const node &b)
{
    if (a.x == b.x)
        return a.y < b.y;
    return a.x < b.x;
}
void run_case()
{
    multiset<node> s;
    s.insert(node{1, 1});
    s.insert(node{1, 1});
    s.insert(node{1, 2});
    s.insert(node{1, 3});
    s.insert(node{2, 2});
    s.insert(node{2, 3});
    for (auto t : s)
    {
        cout << t.x << " " << t.y << "n";
    }
}

运行结果:

32fd4f1aaeb34e0cae6277a0c3d41a37.png

3.find函数的用法

void run_case()
{
    //返回迭代器位置如果没有找到返回值为最后一个元素的下一个位置,也就是end()
    multiset<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    auto it = s.find(2);
    cout << *it << "n";
}

运行结果:

9acc0be029af2b5b3950fc3070bed7e9.png

4.迭代器的用法

void run_case()
{
    //返回迭代器位置如果没有找到返回值为最后一个元素的下一个位置,也就是end()
    multiset<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    auto it1 = s.begin();  //指向第一个元素
    auto it2 = s.rbegin(); //指向最后一个元素
    auto it3 = s.end();    //指向最后一个元素的下一个位置
    auto it4 = s.rend();   //指向第一个元素的前一个位置
    cout << *it1 << "n";
    cout << *it2 << "n";
    //cout << *it3 << "n";
    //cout << *it4 << "n";
    for (auto x : s)
        cout << x << " ";
    cout << "n";
    for (auto it = s.begin(); it != s.end(); it++)
        cout << *it << " ";
    cout << "n";
    for (auto it = s.rbegin(); it != s.rend(); it++)
        cout << *it << " ";
    cout << "n";
}

运行结果:

86cdb3a45a4027628423ebe9ad485a3a.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值