C++ set和map

set

set的底层就是一个二叉搜索树,具有去重和排序的功能

cpp 复制代码
#include<iostream>
#include<set>
using namespace std;

int main()
{
	set<int> s;
	s.insert(1);
	s.insert(5);
	s.insert(4);
	s.insert(6);
	s.insert(3);
	s.insert(5);
	s.insert(6);

	set<int> s1(s.begin(), s.end());
	for (auto e : s) cout << e << " ";
	cout << endl;
	for (auto e : s1)cout << e << " ";
	return 0;
}

输出结果

当按照迭代器去遍历set的时候,发现它是按照升序的顺序打印的,由此可以说明,begin()函数返回的是set中序的的第一个元素,那么end()成员函数返回的就是中序序列的最后一个元素,

count函数

该函数返回的是元素是否在set当中,有就返回1,没有就返回0

cpp 复制代码
void test02()
{
	set<int> s;
	s.insert(1);
	s.insert(5);
	s.insert(4);
	s.insert(6);
	s.insert(3);
	s.insert(5);
	s.insert(6);

	cout << s.count(5) << endl;
}

运行结果

lower_bound和uper_bound函数

lower_bound(x):返回的大于等于x值的第一个元素的迭代器

uper_bound(x):返回的是大于x值的第一个元素的迭代器

cpp 复制代码
void test02()
{
	set<int> s;
	s.insert(1);
	s.insert(5);
	s.insert(4);
	s.insert(6);
	s.insert(3);
	s.insert(5);
	s.insert(6);
	s.insert(2);

	set<int>::iterator it = s.lower_bound(2);    //大于等于2的第一个元素的迭代器
	cout << *it << endl;

	set<int>::iterator it1 = s.upper_bound(2);  //大于2的第一个元素的迭代器
	cout << *it1 << endl;

}

运行结果:

要是找不到的话,再去访问该元素,程序会是崩溃的,所以,需要确保参数的值要小于set里面元素的最大值

multiset容器

multiset容器底层也是二叉搜索树,与set不同的是,multiset中支持多个相同的值,也就是说,里面可以存在多个相同的值,至于插入一个一个存在的值,可以插在这个值的左边,也可以插在这个值的右边,但是,值得注意的是,find一个值的时候,且这个值不止一个,那返回的是中序遍历的第一个值

cpp 复制代码
void test04()
{
	multiset<int> s;
	s.insert(2);
	s.insert(4);
	s.insert(1);
	s.insert(4);
	s.insert(6);

	multiset<int>::iterator it = s.find(4);
	while (it != s.end())
	{
		cout << *it <<" ";
		it++;
	}
}

运行结果:

关于set,我们就介绍这么多,其他的接口,看接口也能看得明白

map

map底层也是二叉搜索树,属于二叉搜索树当中的<k,val>模型,定义的时候如下

cpp 复制代码
void test05()
{
	map<string, string> m;                             //map插入的几种方式
	m.insert({ "insert","插入" });
	m.insert(pair<string, string>("left", "左边"));
	m.insert(make_pair("right", "左边"));
	pair<string, string> s = { "string", "字符串" };
	m.insert(s);

	for (auto e : m) cout << e.first << " " << e.second << endl;     //遍历的第一种方式
	cout << "/////////////////////////////////////////////////////////////////" << endl;
	map<string, string>::iterator it = m.begin();                    //遍历的第二种方式
	while (it != m.end())
	{
		cout << it->first << " " << it->second << endl;
		it++;
	}
}

运行结果:

operator[]函数

cpp 复制代码
void test06()
{
	map<int, string> m = { {1,"hello"},{2,"world"},{3,"fuck"},{4,"you"} };
	cout << m[1] << endl;

}

运行结果

由此课件,map[第一次参数的值]=第二个参数的值

值得注意的是,当map[k]存在的时候,给其复制就是修改对应的值,如果没有,就是新插入一个值

cpp 复制代码
void test06()
{
	map<int, string> m = { {1,"hello"},{2,"world"},{3,"fuck"},{4,"you"} };
	m[5] = "beautiful";
	m[1] = "love";
	for (auto e : m) cout << e.first << ":" << e.second <<endl;

}

运行结果:

统计次数

cpp 复制代码
void test07()
{
		string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
		map<string, int> countTree;
		for (const auto& str : arr)
		{
			// 先查找水果在不在搜索树中
			// 1、不在,说明水果第一次出现,则插入<水果, 1>
			// 2、在,则查找到的节点中水果对应的次数++
			//BSTreeNode<string, int>* ret = countTree.Find(str);
			auto ret = countTree.find(str);
			if (ret == countTree.end())
			{
				countTree.insert({ str, 1 });
			}
			else
			{
				ret->second++;
			}
		}

		for (const auto& e : countTree)
		{
			cout << e.first << ":" << e.second << endl;
		}
		cout << endl;

}

运行结果:

注意,有multiset容器,那么就一定存在multimap容器,容器的使用和multiset一样,这里便不再多赘述

相关推荐
2401_8920709816 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei16 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
Wenweno0o16 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
小O的算法实验室16 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
chenjingming66616 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
cch891816 小时前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳16 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发16 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense16 小时前
设计模式之工厂模式
java·开发语言·设计模式
‎ദ്ദിᵔ.˛.ᵔ₎17 小时前
STL 栈 队列
开发语言·c++