黑马c++ STL部分 笔记(8) set/ multiset 容器

2024-03-02 19:28

本文主要是介绍黑马c++ STL部分 笔记(8) set/ multiset 容器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介
所有元素都会在插入时自动被排序
本质
set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别
set允许容器中有重复的元素
multiset允许容器中有重复的元素

 1.set构造和赋值

// set构造和赋值
/*
构造:
set<T> st; //默认构造函数:
set(const set &st); //拷贝构造函数
赋值:
set& operator=(const set &st); //重载等号操作符
*/
#include <bits/stdc++.h>
using namespace std;
void printset(set<int> &s)
{for (set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{set<int> s1;s1.insert(10); // 插入数据只有insert方式s1.insert(30);s1.insert(40);s1.insert(20);s1.insert(30);// set里的元素自动被排序,不允许插入重复的值printset(s1); // 10 20 30 40// 拷贝构造set<int> s2(s1);printset(s2); // 10 20 30 40// 赋值set<int> s3;s3 = s2;printset(s3); // 10 20 30 40
}
int main()
{test01();
}
/*
总结:
set容器插入数据时用insert
set容器插入数据的数据会自动排序
*/

2. set大小和交换

// set大小和交换
/*不支持resize
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
*/
#include <bits/stdc++.h>
using namespace std;
void printset(set<int> &s)
{for (set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{set<int> s1;s1.insert(10);s1.insert(30);s1.insert(40);s1.insert(20);s1.insert(30);printset(s1); // 10 20 30 40if (s1.empty()){cout << "s1为空" << endl;}else{cout << "s1为不空" << endl;cout << s1.size() << endl; // 4}set<int> s2;s2.insert(10);printset(s2); // 10s1.swap(s2);printset(s1); // 10printset(s2); // 10 20 30 40
}
int main()
{test01();
}
/*
总结:
统计大小 — size
判断是否为空 — empty
交换容器 — swap
*/

 3.set插入和删除

// set插入和删除
/*
insert(elem); //在容器中插入元素。
clear(); //清除所有元素
erase(pos); //删除pos'迭代器'所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem); //删除容器中'值'为elem的元素。(类似remove)
*/
#include <bits/stdc++.h>
using namespace std;
void printset(set<int> &s)
{for (set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{set<int> s1;// 插入s1.insert(30);s1.insert(10);s1.insert(40);s1.insert(20);s1.insert(30);printset(s1); // 10 20 30 40// 删除迭代器位置s1.erase(s1.begin());printset(s1); // 20 30 40// 删除元素s1.erase(40);printset(s1); // 20 30// 清空s1.clear();printset(s1);
}
int main()
{test01();
}
/*
总结:
插入 — insert
删除 — erase
清空 — clear
*/

4.set查找和统计 

// set查找和统计
/*
find(key); //查找key是否存在,若存在,返回该键的元素的'迭代器';若不存在,返回'set.end()';
count(key); //统计key的'元素'个数  set中返回0/1 multiset为0/>0的值
*/
#include <bits/stdc++.h>
using namespace std;
void printset(set<int> &s)
{for (set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{set<int> s1;// 插入s1.insert(30);s1.insert(10);s1.insert(40);s1.insert(20);s1.insert(30);printset(s1); // 10 20 30 40// 查找set<int>::iterator pos = s1.find(40);if (pos != s1.end()){cout << "找到元素:" << *pos << endl; // 找到元素:40}else{cout << "未找到元素:" << endl;}// 统计int num = s1.count(30); // 统计30的个数cout << num << endl;    // 1
}
int main()
{test01();
}
/*
总结:
查找 — find (返回的是迭代器)
统计 — count (对于set,结果为0或者1)
*/

5.set和multiset区别 

// set和multiset区别
/*
区别:
set不可以插入重复数据,而multiset可以
set插入数据的同时会返回插入结果,表示插入是否成功
multiset不会检测数据,因此可以插入重复数据
*/
#include <bits/stdc++.h>
using namespace std;
void test01()
{set<int> s;// set插入pair<set<int>::iterator, bool> ret = s.insert(10);if (ret.second){cout << "第一次插入成功" << endl; // √}else{cout << "第一次插入失败" << endl; // ×}// set重复插入ret = s.insert(10);if (ret.second){cout << "第二次插入成功" << endl; // ×}else{cout << "第二次插入失败" << endl; // √}multiset<int> s2;// multiset插入s2.insert(10);// multiset重复插入s2.insert(10);for (multiset<int>::iterator it = s2.begin(); it != s2.end(); it++){cout << *it << " "; // 10 10}
}
int main()
{test01();
}
/*
总结:
如果不允许插入重复数据可以利用set
如果需要插入重复数据利用multiset
*/

6. pair对组创建

// pair对组创建
/*
两种创建方式:
pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );
*/
#include <bits/stdc++.h>
using namespace std;
void test01()
{pair<string, int> p("Tom", 20);cout << p.first << " " << p.second << endl; // Tom 20pair<string, int> p2 = make_pair("Jerry", 15);cout << p2.first << " " << p2.second << endl; // Jerry 15
}
int main()
{test01();
}
/*
总结:
两种方式都可以创建对组,记住一种即可
*/

7.1  set容器排序
示例一 set存放内置数据类型 

//  set容器排序
/*
学习目标:
set容器默认排序规则为从小到大,掌握如何改变排序规则
主要技术点:
利用仿函数,可以改变排序规则
*/
// 示例一 set存放内置数据类型
#include <bits/stdc++.h>
using namespace std;
class cmp // 仿函数(类)
{
public:bool operator()(int v1, int v2){return v1 > v2;}
};
void test01()
{// 升序set<int> s1;s1.insert(10);s1.insert(30);s1.insert(20);s1.insert(50);s1.insert(40);for (set<int>::iterator it = s1.begin(); it != s1.end(); it++){cout << *it << " "; // 10 20 30 40 50}cout << endl;// 降序,在创建容器时就指定排序规则set<int, cmp> s2;s2.insert(10);s2.insert(30);s2.insert(20);s2.insert(50);s2.insert(40);for (set<int, cmp>::iterator it = s2.begin(); it != s2.end(); it++){cout << *it << " "; // 50 40 30 20 10}cout << endl;
}
int main()
{test01();
}
/*
总结:
对于自定义数据类型,set必须指定排序规则才可以插入数据
*/

7.2  set容器排序
示例二 set存放自定义数据类型 

//  set容器排序
// 示例二 set存放自定义数据类型
#include <bits/stdc++.h>
using namespace std;class person
{
public:person(string name, int age){this->name = name;this->age = age;}string name;int age;
};
class cmp
{
public:bool operator()(person p1, person p2){// 按年龄降序return p1.age > p2.age;}
};
void test01()
{/// 自定义的类型 都会指定排序类型set<person, cmp> s;person s1("刘备", 24);person s2("关羽", 28);person s3("张飞", 25);person s4("赵云", 21);s.insert(s1);s.insert(s2);s.insert(s3);s.insert(s4);for (set<person, cmp>::iterator it = s.begin(); it != s.end(); it++){cout << (*it).name << " " << (*it).age;/*关羽 28张飞 25刘备 24赵云 21*/cout << endl;}
}
int main()
{test01();
}
/*
总结:
对于自定义数据类型,set必须指定排序规则才可以插入数据
*/

这篇关于黑马c++ STL部分 笔记(8) set/ multiset 容器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767194

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl