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



相关文章
|
4天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
4天前
|
存储 虚拟化 数据中心
|
3天前
|
存储 算法 C++
详解C++中的STL(标准模板库)容器
【4月更文挑战第30天】C++ STL容器包括序列容器(如`vector`、`list`、`deque`、`forward_list`、`array`和`string`)、关联容器(如`set`、`multiset`、`map`和`multimap`)和容器适配器(如`stack`、`queue`和`priority_queue`)。它们为动态数组、链表、栈、队列、集合和映射等数据结构提供了高效实现。选择合适的容器类型可优化性能,满足不同编程需求。
|
4天前
|
编译器 C语言 C++
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
13 0
|
4天前
|
安全 编译器 程序员
【C++入门】内联函数、auto与基于范围的for循环
【C++入门】内联函数、auto与基于范围的for循环
|
4天前
|
编译器 C语言 C++
【C++入门】缺省参数、函数重载与引用(上)
【C++入门】缺省参数、函数重载与引用
|
4天前
|
C语言 C++
【C++入门】关键字、命名空间以及输入输出
【C++入门】关键字、命名空间以及输入输出
|
4天前
|
人工智能 分布式计算 Java
【C++入门】初识C++
【C++入门】初识C++
|
4天前
|
C++ Python
C++教学——从入门到精通 10.循环
学习编程建议先Python后C++,以避免C++思维影响。课程涵盖for、while和do while循环。for循环示例:`for(int i=0;i&lt;n;i++)`,用于计算114514天后的金币总数(1145140个)。死循环通过`for(int i=0;;i++)`实现,用`break`退出。while循环格式`while(条件)`,同样可解决金币问题。do while循环特点是先执行后判断,结构为`do{...}while(条件)`。
15 2
|
5天前
|
C++
C++入门项目——通讯管理系统
C++入门项目——通讯管理系统