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



相关文章
|
8月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
218 2
|
5月前
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
234 0
|
9月前
|
存储 缓存 C++
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 的奥秘,从入门到高效编程
|
8月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
339 3
|
12月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
287 3
【C++】map、set基本用法
|
12月前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
239 5
|
12月前
|
存储 C++ 容器
【C++】set模拟实现
C++中的`set`是STL提供的一种关联容器,用于存储唯一元素并自动按特定顺序(默认升序)排序。其内部通过红黑树实现,保证了高效的插入、删除和查找操作,时间复杂度均为O(log n)。`set`支持迭代器遍历,提供了良好的数据访问接口。
197 3
|
3月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
707 108

热门文章

最新文章