C++入门到理解set/multiset容器、pair对组

简介: C++入门到理解set/multiset容器、pair对组

一:基本概念

在插入元素的时候会自动排好序,比如插入的是1,3,4,2,打印是1,2,3,4.底层是通过二叉树结构实现的,set容器不允许有重复的元素,但是multiset允许有元素重复。

二:构造,遍历,赋值

#include <iostream>
#include <set>
using namespace std;
int main() {
  //构造set
  set<int> s;
  s.insert(1);
  s.insert(2);
  s.insert(2);//插入一个重复的元素
  s.insert(3);
  s.insert(4);
  //遍历
  for (set<int>::iterator it = s.begin(); it!= s.end(); it++) {
    cout<<*it;//打印结果1234自动排序,重复的不打印
  }
  //拷贝构造
  set<int> s1(s);
  for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) {
    cout << *it;//1234
  }
  //赋值
  set<int> s3;
    s3 = s1;
  for (set<int>::iterator it = s3.begin(); it != s3.end(); it++) {
    cout << *it;//1234
  }
 
}

三:常见操作

1.容器大小、是否为空、交换容器

#include <iostream>
#include <set>
using namespace std;
int main() {
  set<int> s;
  s.insert(1);
  s.insert(3);
  s.insert(2);
  //判断是否为空
  if (!s.empty()) {
                //大小
    cout << s.size();
  }
  set<int> s2;
  s2.insert(1);
  s2.insert(3);
        //交换
  s.swap(s2);
  for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
    cout << *it;//313
  }
  cout << endl;
  for (set<int>::iterator it = s2.begin(); it != s2.end(); it++) {
    cout << *it;//123
  }
}

2.插入和删除

#include <iostream>
#include <set>
using namespace std;
int main() {
  set<int> s;
  s.insert(1);
  s.insert(3);
  s.insert(2);
  //删除
  s.erase(s.begin());
  for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
    cout << *it;//23
  }
  //删除重载
  s.erase(2);
  for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
    cout << *it;//3
  }
}

3.查找和统计

#include <iostream>
#include <set>
using namespace std;
int main() {
  set<int> s;
  s.insert(1);
  s.insert(3);
  s.insert(2);
  set<int>::iterator it = s.find(2);
  if (it != s.end()) {
    cout << *it;//2
  }
  //统计3的个数。对于set这个结果始终是1或者0 但是multiset不一样
  int num = s.count(3);
  cout << num;
}

四:set和multiset区别

1.set允许插入重复元素,multiset不允许插入元素

2.set插入数据的同时会返回结果,表示插入成功

#include <iostream>
#include <set>
using namespace std;
int main() {
  set<int> s;
//插入成功,返回一个对组结构的数据pair
  pair<set<int>::iterator,bool> ret =s.insert(1);
  if (ret.second) {
    cout << "第一次插入成功";
  }
  else {
    cout << "插入失败";
  } 
}

3.multiset不会检测数据 因此可以插入重复元素

五:pair对组

1.对组的创建和定义

pair是c++中用来定义两个成对出现的数据

#include <iostream>
#include <set>
#include <string>
using namespace std;
int main() {
  //第一种创建方式
  pair<string, int> p(string("aaa"), 1);
  cout << p.first << p.second;//成对元素第一个用first第二个使用second
  //第二种创建方式
  pair<string, int> p1 = make_pair(string("aaa"), 1);
  cout << p.first << p.second;
}

六:set中排序规则的指定

1.如果存放的是内置数据类型

#include <iostream>
#include <set>
#include <string>
using namespace std;
 
//通过自定义仿函数定义比较规则
class MyCompare
{
public:
  bool operator()(int a, int b) const{
    return a > b;//降序
  }
};
int main() {
  set<int, MyCompare>s;//引入仿函数
  s.insert(30);
  s.insert(20);
  for (set<int, MyCompare>::iterator it = s.begin(); it != s.end(); it++) {
    cout << *it;
  }
}

2.如果存放的是自定义数据类型

#include <iostream>
#include <set>
#include <string>
using namespace std;
class person {
public:
  person(int age, string name) {
    this->age = age;
    this->name = name;
  }
  int age;
  string name;
};
class MyComparePerson
{
public:
  bool operator()(const person& p1, const person& p2) const{
    return p1.age > p2.age;
  }
};
int main() {
  //set存放自定义数据类型要制定排序规则
  set<person, MyComparePerson>s;
  person p1(10, "aaa");
  person p2(20, "bbb");
  person p3(30, "ccc");
  s.insert(p1);
  s.insert(p2);
  s.insert(p3);
  for (set<person, MyComparePerson>::iterator it = s.begin(); it != s.end(); it++) {
    cout << it->name;
  }
}



相关文章
|
16天前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
30 2
C++入门12——详解多态1
|
17天前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
22 3
|
16天前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
45 1
|
17天前
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
48 1
|
17天前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
15 1
|
17天前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
19 1
|
17天前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
29 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
6天前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
13 0
|
6天前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
12 0
|
14天前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
57 0