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



相关文章
|
13天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
55 2
|
15天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
22天前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
44 2
|
27天前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!
|
1月前
|
Ubuntu Shell 开发者
Docker入门:轻松开始容器化之旅
【10月更文挑战第17天】Docker 是一种开源的应用容器引擎,它让开发者能够“一次构建、到处运行”。Docker 通过容器化技术将应用程序及其依赖打包在一起,从而确保应用在任何环境中都能一致地运行。本文将为新手用户提供一个全面的Docker入门指南,包括基本概念、优势、安装配置以及如何创建和管理容器。
46 2
|
1月前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
1月前
|
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容器编排
76 3
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
2月前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
61 4
|
1月前
|
运维 Kubernetes Cloud Native
云原生时代的容器编排:Kubernetes入门与实践
【10月更文挑战第4天】在云计算的浪潮中,云原生技术以其敏捷、可扩展和高效的特点引领着软件开发的新趋势。作为云原生生态中的关键组件,Kubernetes(通常被称为K8s)已成为容器编排的事实标准。本文将深入浅出地介绍Kubernetes的基本概念,并通过实际案例引导读者理解如何利用Kubernetes进行高效的容器管理和服务部署。无论你是初学者还是有一定经验的开发者,本文都将为你打开云原生世界的大门,并助你一臂之力在云原生时代乘风破浪。
下一篇
无影云桌面