【C++】map和set的使用

07-19 1004阅读

前言:前面我们学习了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购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]