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";
}

输出结果

image-20200904090608995

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";
    }
}

输出结果:

image-20200904091127615

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";
}

输出结果:

image-20200904091321614

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";
}

输出结果:

image-20200904091812858

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";
}

运行结果:

image-20200904094034575

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";
    }
}

运行结果:

image-20200904094658739

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";
}

运行结果:

image-20200904094816258

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";
}

运行结果:

image-20200904094921681