C++ STL set/multiset 容器详解

1. 什么是set/multiset容器?

set/multiset属于关联式容器,底层结构使用二叉树实现的。
set/multiset的特点是︰所有的元素在插入时会自动被排序。而set与multiset容器的区别就是∶set容器中不允许有重复的元素,而multiset允许容器中有重复的元素。

2. set的初始化函数

set<T> st //默认构造函数
set(const set &st)   //拷贝构造函数
set& operator=(const set& st)   //重载登号操作符

3. set的插入和删除函数

insert(elem)   //在容器中插入元素

clear()        //清除所有元素

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

erase(beg,end)
//删除区间[beg,end)的所有元素,返回下一个元素的迭代器
//当然,set的迭代器也不能进行代数运算

erase(elem)     //删除容器中值为elem的元素
 

4. set的大小和交换函数

size();    //返回容器中元素的数量

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

swap(st);     //交换两个集合容器  

5. 案例说明

#include<iostream>
#include<set>

using namespace std;

void Print(set<int> s)
{
    for(auto i=s.begin();i!=s.end();i++)
    {
        cout<<*i<<" ";
    }
    cout<<endl<<endl;
}
int main()
{
    set<int> s;
    s.insert(10);
    s.insert(20);
    s.insert(3);
    s.insert(5);
    s.insert(1);
    //插入后自动升序排序
    Print(s);
    cout<<s.size()<<endl;

    set<int>s2(s);
    Print(s2);

    set<int>s3=s2;
    Print(s3);
    s3.insert(0);
    s2.swap(s3);
    Print(s2);

    s.erase(s.begin());
    Print(s);
    s.erase(20);
    Print(s);

    s.clear();   //    s.erase(s.begin(),s.end());
    Print(s);
    if(s.empty())
    {
        cout<<"空"<<endl;
    }
    return 0;
}

6. set的查找与统计函数

find(key);   //查找key是否存在,存在返回该元素迭代器

cout(key);   //统计key元素个数 
//要注意的是,set不允许出现重复的元素,所以set的cout返回值只可能出现0/1

案例:

#include<iostream>
#include<set>
using namespace std;
//set容器的查找和统计

int main()
{
set<int>s;
s.insert(1);
s.insert(0);
s.insert(3);
s.insert(4);

auto pos=s.find(3);
cout<<*pos<<endl;
cout<<s.count(6)<<endl;
cout<<s.count(4)<<endl;
return 0;
}


7. set与multiset 的区别

Multiset是set集合容器的一种,其拥有set的全部内容,在此基础之上,multiset还具备了可以重复保存元素的功能,因此会有略微和set的差别。

Multiset容器在执行insert()时,只要数据不是非法数据和空数据,insert就总是能够执行,无论时一个数据还是一段数据。

Multiset容器中的find()函数回返回和参数匹配的第一个元素的迭代器,即时存在多个元素也只是返回第一个,如{10,20,20,20}搜索20进行匹配将会返回第二个参数,如果没有符合的参数则结束迭代器。

同理诸如lower_bound()等的需要进行一个位置的返回值,则统统返回第一个大于或等于查找的值。

#include<iostream>
#include<set>
using namespace std;
//set容器的查找和统计

int main()
{
multiset<int>s;
s.insert(1);
s.insert(0);
s.insert(3);
s.insert(4);
s.insert(4);

auto pos=s.find(3);
cout<<*pos<<endl;
cout<<s.count(2)<<endl;
cout<<*(s.lower_bound(2))<<endl;
cout<<s.count(4)<<endl;
return 0;
}
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
C++ STL中的map和multimap是关联容器,用于存储键值对(key-value pairs),其中每个键(key)唯一对应一个值(value)。 map是一个有序容器,根据键的大小进行自动排序,默认按照键的升序进行排序。每个键只能在map中出现一次,如果尝试插入具有相同键的元素,新元素将替代旧元素。 multimap也是一个有序容器,与map不同的是,它允许多个具有相同键的元素存在。多个具有相同键的元素将按照插入的顺序进行存储,而不会自动排序。 这两个容器都提供了一系列的操作函数,如insert、erase、find等,用于插入、删除和查找元素。 以下是一个使用map的简单示例: ```cpp #include <iostream> #include <map> int main() { std::map<std::string, int> scores; scores.insert(std::make_pair("Alice", 90)); scores.insert(std::make_pair("Bob", 80)); scores.insert(std::make_pair("Charlie", 70)); // 查找并输出Bob的分数 std::cout << "Bob's score: " << scores["Bob"] << std::endl; // 遍历并输出所有键值对 for (const auto& pair : scores) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` 上述示例中,我们创建了一个存储string类型键和int类型值的map容器scores。通过insert函数依次插入了三个键值对。然后我们通过scores["Bob"]来获取Bob的分数,并输出结果为80。 接着我们使用范围-based for循环遍历map中的所有键值对,并输出每个键值对的键和值。 multimap的用法与map类似,只是它允许多个具有相同键的元素存在。 这些关联容器在查找和插入操作上具有较高的效率,特别适用于需要根据键进行快速查找的场景。在实际应用中,你可以根据自己的需求选择适合的容器类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值