【C++】map和set的使用

2024-07-19 1006阅读

前言:前面我们学习了STL中的string、vector、list等等,今天我们就进一步学习更复杂的容器,map和set。

💖 博主CSDN主页:卫卫卫的个人主页 💞

👉 专栏分类:高质量C++学习 👈

💯代码仓库:卫卫周大胖的学习日记💫

💪关注博主和博主一起学习!一起努力!

【C++】map和set的使用


关联式容器于键值对

什么是关联式容器

C++中的关联式容器是一种可以存储键-值对的容器,它使用键来快速检索值。与序列式容器不同的是,其里面存储的是结构的键值对(不懂的可以去看看上期的博客),在数据检索时比序列式容器效率更高。C++标准库提供了四种关联式容器:std::set、std::multiset、std::map和std::multimap。

  1. std::set:std::set是一个基于红黑树实现的有序集合,它存储唯一的元素。元素按照默认的比较函数进行排序,也可以通过自定义比较函数进行排序。

  2. std::multiset:std::multiset是一个基于红黑树实现的有序集合,它可以存储重复的元素。元素按照默认的比较函数进行排序,也可以通过自定义比较函数进行排序。

  3. std::map:std::map是一个基于红黑树实现的有序关联容器,它存储键-值对,并根据键进行排序。键是唯一的,如果插入重复的键,新的值将覆盖旧的值。

  4. std::multimap:std::multimap是一个基于红黑树实现的有序关联容器,它可以存储重复的键-值对。键是可以重复的,插入重复的键-值对会按顺序插入。

关联式容器提供了快速的元素查找操作,时间复杂度为O(log n)。它们还提供了插入和删除元素的操作,并且保持元素的有序性。


键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。


键值对- pair

在C++中,键值对可以使用pair模板类来表示,该类定义在头文件中。pair模板类包含两个公共成员变量first和second,分别表示键和值。

下面是一个使用pair的简单示例:

#include 
#include 
int main() {
    std::pair myPair; // 创建一个键值对对象
    myPair.first = 1; // 设置键的值
    myPair.second = "hello"; // 设置值的值
    std::cout 
    typedef T1 first_type;     // 第一个元素的类型
    typedef T2 second_type;    // 第二个元素的类型
    T1 first;                  // 第一个元素
    T2 second;                 // 第二个元素
    // 构造函数
    pair();
    pair(const T1& x, const T2& y);
    template 
    int a = 1;
    double b = 3.14;
    auto myPair = make_pair(a, b);
    std::cout 
    int id = 1234;
    string name = "Alice";
    return make_pair(id, name);//因此C++无法返回多个参数,通过pair可以解决这一缺陷
}
int main() {
    pair
	vector
		cout 
		cout 1, 2, 3, 4, 5}; // 使用 initializer list 初始化 set 对象

	set 20, 30, 40 }); // 添加多个元素到 set 中
	return 0;
}

	set 20, 30, 40 }); // 添加多个元素到 set 中
	int size = mySet.size(); // 获取 set 的元素数量
	return 0;
}

	set 20, 0, 40 }); // 添加多个元素到 set 中
	int size = mySet.size(); // 获取 set 的元素数量
	for (const auto& element : mySet)//按照升序的方式遍历 
	{
		cout 
	set 20, 0, 40 }); // 添加多个元素到 set 中
	auto it = mySet.find(10); // 查找元素 10 在 set 中的迭代器
	if (it != mySet.end()) {
		// 元素 10 存在于 set 中
		cout 
	set 20, 0, 40 }); // 添加多个元素到 set 中
	mySet.erase(10); // 从 set 中删除元素 10
	mySet.clear(); // 清空 set 中的所有元素
	return 0;
}

	multiset10,20,30,40,50,10,20,30};//使用initerator list初始化
	return 0;
}

	multiset
	multiset
		cout 
	multiset 10,20,30,10,10,50 };
	int count = my_set.count(10);//查看10出现的次数
	cout 
	multiset 10,20,30,10,10,50 };
	auto it = myMultiset.find(20);
	if (it != myMultiset.end()) {
		cout 
		cout 
	multiset 10,20,30,10,10,50 };
	myMultiset.erase(20);//删除20,删除中序遍历出现的第一个20
	return 0;
}

	multiset 10,20,30,10,10,50 };
	auto it = myMultiset.begin();
	myMultiset.erase(it);//删除迭代器所指向的元素
	return 0;
}

	multiset 10,20,30,10,10,50 };
	myMultiset.clear();//清空容器中所有的元素
	return 0;
}

	multiset 10,20,30,10,10,50 };
	int size = myMultiset.size();
	cout 
	multiset 10,20,30,10,10,50 };
	bool isEmpty = myMultiset.empty();//判断容器是否为空
	return 0;
}

	map {"weiwei",90},{"zhou",100}, {"tang", 90}};
	return 0;
}

	map "weiwei", 90 });
	return 0;
}

	map "zhou", 90 });
	cout 
	map "zhou", 90 });
	my_map.erase("weiwei"); // 根据键删除对应的键值对
	return 0;
}

	map "zhou", 90 });
	auto it = my_map.find("weiwei");//查找key值为"weiwei"的迭代器的位置
	cout 
	map {"wei",90},{"zhou",100},{"tang",99} };
	map
		cout 
		cout 
	map {"wei",90},{"zhou",100},{"tang",99} };
	cout 
    std::map
    std::multimap
        std::cout 
        std::cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]