当前位置: 代码迷 >> 综合 >> C++常用STL容器--set/multiset
  详细解决方案

C++常用STL容器--set/multiset

热度:79   发布时间:2023-11-23 11:49:39.0

文章目录

    • 基本概念
    • set和multiset区别
    • set构造、赋值
    • set 大小、交换
    • set插入、删除
    • set查找、统计
    • set容器排序
    • pair对组创建

基本概念

特点: 所有元素都会在插入时自动被排序

本质: set/multiset属于关联式容器,底层结构用二叉树实现

set和multiset区别

  • set不允许容器中有重复的元素,multiset允许容器中有重复的元素
  • set插入数据的同时会返回插入结果,表示插入是否成功
  • multiset不会检测数据,因此可以插入重复数据

set构造、赋值

函数原型

构造:

  • set<T> st; //默认构造
  • set(const set &st); //拷贝构造

赋值:

  • = //重载等号操作符

set 大小、交换

函数原型

  • .size();//返回容器中元素的数目
  • .empty();//判断容器是否为空
  • .swap(st);//交换两个set容器

set插入、删除

函数原型

插入:

  • .insert(elem);//插入值为elem的元素

删除:

  • .clear();//清除所有元素
  • .erase(pos);//删除指定pos位置的元素,返回下一个元素的迭代器
  • .erase(beg,end);//删除区间【beg,end)中的数据,返回下一个元素的迭代器
  • .erase(elem);//删除值为elem的元素

set查找、统计

函数原型

  • .find(key);//查找key值是否存在,若存在,返回该值的元素的迭代器;若不存在,返回.end()
  • .count(key);//统计key的元素个数,set容器结果只有0或1,multiset可以有不同的值

set容器排序

set容器默认排序规则为从小到大,可以利用仿函数来改变排序规则

示例一 set存放内置数据类型

//仿函数,指定排序规则为从大到小
class MyCompare
{
public:bool operator()(int v1, int v2) const{return v1 > v2;}
};set<int, MyCompare>s2;	//传入自定义的仿函数,实现自定义排序
s2.insert(10);
s2.insert(30);
s2.insert(20);
s2.insert(50);
s2.insert(40);
for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {cout << *it << " ";
}
cout << endl;

输出结果:50 40 30 20 10

示例二 set存放自定义数据类型

//自定义的数据类型
class Person 
{
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};//仿函数,指定排序规则为从大到小
class PersonCompare
{
public:bool operator()(const Person& p1, const Person& p2) const{//按照年龄降序return p1.m_Age > p2.m_Age;}
};//自定义数据类型,都会指定排序规则
set<Person,PersonCompare>s3;Person p1("Tom", 24);
Person p2("Jerry", 28);
Person p3("Peter", 25);
Person p4("Marry", 27);
s3.insert(p1);
s3.insert(p2);
s3.insert(p3);
s3.insert(p4);for (set<Person>::iterator it = s3.begin(); it != s3.end(); it++) {cout << "name:" << (*it).m_Name << "    age:" << (*it).m_Age << endl;
}

输出结果:

name:Jerry age:28
name:Marry age:27
name:Peter age:25
name:Tom age:24

小结

  • 利用仿函数可以指定set容器的排序规则
  • 对于自定义数据类型,set必须要指定排序规则

pair对组创建

函数原型

  • pair<type,type> p (value1,value2);
  • pair<type,type> p = make_pair(value1,value2);

示例

	//第一种创建方式pair<string, int>p("Tom", 20);cout << "name: " << p.first << "  age: " << p.second << endl;//第二种创建方式pair<string,int>p2 = make_pair("Jerry", 15);cout << "name: " << p2.first << "  age: " << p2.second << endl;