set与map使用

目录

set使用

insert

 find与erase

 lower_bound 与 upper_bound

 equal_range

count

multiset使用

insert

find

count

equal_range与erase

map使用

insert

迭代器

operator[]

统计次数

multimap使用


前置学习内容: 搜索二叉树-CSDN博客

set与map的底层都是搜索二叉树, 而set对应的是key模型,map对应的是key-value模型

前面介绍STL容器的文章已经讲解了STL通用的很多接口,因此本篇博客仍然重点展示较为新颖的的接口与用法

set使用

insert

由于搜索二叉树不支持重复值的插入,所以set中序遍历就可以达到去重+排序的目的

#include <set>
void test_set1()
{set<int> s;s.insert(6);s.insert(3);s.insert(3);s.insert(3);s.insert(4);s.insert(4);pair<set<int>::iterator, bool> ret1 = s.insert(1); //接受insert返回值cout << ret1.second << endl; //1auto ret2 = s.insert(1); //auto不方便看出insert类型cout << ret2.second << endl; //0for (auto& e : s){cout << e << " "; //1 3 4 6 }cout << endl;
}

 find与erase

void test_set2()
{set<int> s1;s1.insert(6);s1.insert(3);s1.insert(1);s1.insert(4);s1.erase(4); //直接给值删set<int>::iterator it = s1.find(3); //没找到,返回end()if (it != s1.end()){s1.erase(it); //给迭代器删}for (auto& e : s1){cout << e << " "; //1 6 }cout << endl;
}
void test_set3()
{set<int> s1;s1.insert(6);s1.insert(3);s1.insert(1);s1.insert(4);s1.erase(4); //正常删除s1.erase(40); //删除一个不存在的值,也没有问题set<int>::iterator it2 = s1.find(30); //没找到,返回end()s1.erase(it2);  //erase(无效的迭代器), 代码直接崩溃for (auto& e : s1){cout << e << " ";}cout << endl;
}

 lower_bound 与 upper_bound

void test_set4()
{std::set<int> s1;std::set<int>::iterator itlow, itup;for (int i = 1; i < 10; i++) s1.insert(i * 10); // 10 20 30 40 50 60 70 80 90//左闭右开itlow = s1.lower_bound(30); //返回大于等于30的值的迭代器 --- 30位置的迭代器itup = s1.upper_bound(60); //返回大于60的迭代器 --- 70位置的迭代器//删除时区间是左闭右开s1.erase(itlow, itup); for (auto& e : s1){cout << e << " "; //10 20 70 80 90}cout << endl;
}
void test_set5()
{std::set<int> s1;std::set<int>::iterator itlow, itup;for (int i = 1; i < 10; i++)s1.insert(i * 10); // 10 20 30 40 50 60 70 80 90//左闭右开itlow = s1.lower_bound(25); //返回大于等于25的值的迭代器 --- 30itup = s1.upper_bound(60); //返回>60的迭代器 --- 70//删除时区间是左闭右开s1.erase(itlow, itup); for (auto& e : s1){cout << e << " "; //10 20 70 80 90}cout << endl;
}
void test_set6()
{std::set<int> s1;std::set<int>::iterator itlow, itup;for (int i = 1; i < 10; i++)s1.insert(i * 10); // 10 20 30 40 50 60 70 80 90//左闭右开itlow = s1.lower_bound(25); //返回大于等于25的值的迭代器 --- 30itup = s1.upper_bound(70); //返回>70的迭代器 --- 80//删除时区间是左闭右开s1.erase(itlow, itup);for (auto& e : s1){cout << e << " "; //10 20 80 90}cout << endl;
}

 equal_range

void test_set7()
{std::set<int> myset;for (int i = 1; i <= 5; i++) myset.insert(i * 10);   // myset: 10 20 30 40 50//first:>=val, second: >valstd::pair<std::set<int>::const_iterator, std::set<int>::const_iterator> ret;ret = myset.equal_range(30); //30, 40//ret = myset.equal_range(35); //40, 40std::cout << "the lower bound points to: " << *ret.first << '\n'; std::cout << "the upper bound points to: " << *ret.second << '\n'; 
}

count

void test_set8()
{std::set<int> s1;s1.insert(6);s1.insert(3);s1.insert(1);s1.insert(4);if(s1.count(2)) //count用于统计个数,要么是0,要么是1, 所以也可以判断在不在{cout << "2在" << endl;}else{cout << "2不在" << endl;}
}

multiset使用

multiset和set相比,区别是multiset允许重复值的插入

insert

void test_set9()
{multiset<int> s;s.insert(6);s.insert(2);s.insert(2);s.insert(1);s.insert(5);s.insert(4);s.insert(7);s.insert(5);multiset<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " "; //1 2 2 4 5 5 6 7it++;}cout << endl;
}

find

void test_set10()
{multiset<int> s;s.insert(6);s.insert(2);s.insert(2);s.insert(2);s.insert(7);s.insert(5);multiset<int>::iterator it = s.find(2); //有多个2,返回中序的第一个2while (it != s.end()){cout << *it << " "; //2 2 2 5 6 7it++;}cout << endl;
}

count

void test_set11()
{multiset<int> s;s.insert(6);s.insert(2);s.insert(2);s.insert(2);s.insert(7);s.insert(5);cout << s.count(2) << endl; //3
}

equal_range与erase

void test_set12()
{multiset<int> s;s.insert(6);s.insert(2);s.insert(2);s.insert(2);s.insert(7);s.insert(5);//[>=val, >val)auto ret = s.equal_range(2);//s.erase(ret.first, ret.second); //但其实没有必要这么删除size_t n = s.erase(2); //直接删除全部的2cout << n << endl; //这就是erase不返回bool值,返回删除的个数的意义for (auto& e : s){cout << e << " "; //5 6 7}cout << endl;
}

map使用

insert

void test_map1()
{map<string, string> dict;dict.insert(pair<string, string>("sort", "排序")); //第一个可以不是const, insert函数内部会转换dict.insert(pair<string, string>("insert", "插入"));dict.insert(pair<const char*, const char*>("insert", "插入"));
}

void test_map2()
{map<string, string> dict;dict.insert(make_pair("left", "左边")); //推荐这个string s1("xxx"), s2("yyy");dict.insert(make_pair(s1, s2));
}

迭代器

void test_map3()
{map<string, string> dict;dict.insert(make_pair("left", "左边"));dict.insert(make_pair("sort", "排序"));dict.insert(make_pair("right", "右边"));dict.insert(make_pair("xxx", "yyy"));map<string, string>::iterator it = dict.begin();while (it != dict.end()){cout << (*it).first << ":" << (*it).second << endl;//cout << it->first << ":" << it->second << endl;//cout << it.operator->()->first << ":" << it->second << endl;++it;}//打印结果://left:左边//right : 右边//sort : 排序//xxx : yyycout << endl;for (auto& kv : dict){//kv.first += 'x'; //first不能修改kv.second += 'x'; //second可以修改cout << kv.first << ":" << kv.second << endl;}//打印结果://left:左边x//right : 右边x//sort : 排序x//xxx : yyyx
}

operator[]

map中的[ ]返回key对应的value的引用,具体实现如下:

void test_map4()
{map<string, string> dict;dict.insert(make_pair("left", "左边"));dict["erase"]; //插入cout << dict["erase"] << endl; //查找dict["erase"] = "删除"; //修改cout << dict["erase"] << endl; //查找dict["test"] = "测试"; //插入+修改dict["left"] = "左边,剩余"; //修改
}

统计次数

法一:

void test_map5()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;for (auto str : arr){auto ret = countMap.find(str);if (ret == countMap.end())	{countMap.insert(make_pair(str, 1));}else{ret->second++;}}for (auto& kv : countMap){cout << kv.first << ":" << kv.second << endl;}//打印结果://苹果:6//西瓜 : 3//香蕉 : 2
}

法二:

void test_map6()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;for (auto str : arr){countMap[str]++; //map中的[]返回key对应的value的引用}for (auto& kv : countMap){cout << kv.first << ":" << kv.second << endl;}//打印结果://苹果:6//西瓜 : 3//香蕉 : 2
}

multimap使用

multimap和multiset类似,multimap允许同样的key值出现

单multimap是不支持[ ]的,因为相同的key可能对应多个value, [ ]就不知道返回哪个value了

void test_map7()
{multimap<string, string> dict;dict.insert(make_pair("left", "左边")); dict.insert(make_pair("left", "剩余")); //multimap的insert直接返回迭代器,不返回正负数dict.insert(make_pair("left", "左边"));for (auto& kv : dict){cout << kv.first << ":" << kv.second << endl; }//打印结果://left:左边//left : 剩余//left : 左边
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/618240.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多输入多输出 | Matlab实现XGboost多输入多输出预测

多输入多输出 | Matlab实现XGboost多输入多输出预测 目录 多输入多输出 | Matlab实现XGboost多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现XGboost多输入多输出预测 1.data为数据集&#xff0c;10个输入特征&#xff0c;3个输出变量…

Doris 内网安装部署,基于 CentOS 7

实测 CentOS 7.6 和 7.9都可用&#xff0c;CentOS安装包为&#xff1a;标准安装盘DVD版&#xff0c;如果系统安装的是精简版&#xff0c;需要挂载DVD版或者自行下载依赖。 参考文档 快速开始 - Apache Doris Doris 下载地址&#xff1a;2.1.1 ( Latest ) -> x64 ( avx2 )…

transformer上手(4) —— 模型与分词器

1 模型 除了像之前使用 AutoModel 根据 checkpoint 自动加载模型以外&#xff0c;我们也可以直接使用模型对应的 Model 类&#xff0c;例如 BERT 对应的就是 BertModel&#xff1a; from transformers import BertModel model BertModel.from_pretrained("bert-base-ca…

滚雪球学Java(75):Java零基础,轻松学会文件读写技巧

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Unsupervised Learning ~ Anomaly detection

unusual events vibration: 振动 Density estimation: Gaussian(normal) Distribution. standard deviation: 标准差 variance deviation sigma Mu Parameter estimation Anomaly detection algorithm 少量异常样本点的处理经验 algorithm evaluation skewed datatsets:…

2024年腾讯云最新优惠活动及领券入口整理分享

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人选择将业务部署在云端。腾讯云作为国内知名的云计算服务提供商&#xff0c;为用户提供了丰富的云产品和服务。为了帮助用户降低成本&#xff0c;腾讯云定期推出各种优惠活动。本文将为大家整理分享2024年腾讯云的最新…

UE5 HLSL 详细学习笔记

这里的POSITION是变量Position的语义&#xff0c;告诉寄存器&#xff0c;此变量的保存位置&#xff0c;通常语义用于着色器的输入和输出&#xff0c;以冒号“&#xff1a;”的方式进一步说明此变量&#xff0c;COLOR也类似 还有什么语义呢&#xff1f; HLSL核心函数&#xff1a…

1panel更新系统

准备两个软件包 名为dist的前端包 以.jar为后缀的后端jar包 更新后端 进去1Panel管理页面(浏览器收藏里有) http://127.0.0.1:42689/f2a8a874bd 点击容器&#xff0c;将名为app的容器直接删除掉 打开软件electerm 点击书签&#xff0c;连接2222 连接成功后长这样&#xff…

优化Python开发环境的几个神技巧

用Python编代码体验极佳&#xff0c;并且随着新版本的发布越来越好&#xff01; 对于很多人而言&#xff0c;Python提供的大量免费函数库、高可读性的程序和新引入的类型注释让很多爱不释手。 然而&#xff0c;数据科学家特别容易使自己的Jupyter notebook变得庞大而杂乱&…

【 信息技术教资面试备战】

信息技术教资面试 教育事业&#xff0c;是一项终身事业&#xff0c;是从胎教开始到临终教育的一个循序渐进的过程。为此&#xff0c;教育艺术应当是人类生存之光。 一、什么是信息技术教资面试 考什么&#xff1a; 信息技术教资面试主要考察的内容包括结构化面试、试讲和答辩。…