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



目录
打赏
0
0
0
0
43
分享
相关文章
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
48 2
|
27天前
|
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
59 3
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
云原生入门:从容器到微服务
本文将带你走进云原生的世界,从容器技术开始,逐步深入到微服务架构。我们将通过实际代码示例,展示如何利用云原生技术构建和部署应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
53 5
【C++】set模拟实现
C++中的`set`是STL提供的一种关联容器,用于存储唯一元素并自动按特定顺序(默认升序)排序。其内部通过红黑树实现,保证了高效的插入、删除和查找操作,时间复杂度均为O(log n)。`set`支持迭代器遍历,提供了良好的数据访问接口。
81 3
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
45 16
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等