map和set使用讲解

map的使用

map的介绍

  • map是C++ STL(标准模板库)中的一个关联容器。

  • 它提供了一种有序的键值对存储方式,其中每个元素都由一个键和一个值组成。

  • map中的元素根据键的值自动进行排序,并且通过键快速访问对应的值。

  • map使用红黑树数据结构来实现内部的存储和排序。

  • 红黑树是一种平衡二叉搜索树,可以保证插入、删除和查找操作的时间复杂度都是对数级别(O(logn))

insert接口的使用

  • 插入单个键值对:

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
  • 使用emplace函数插入新的键值对:

std::map<int, std::string> myMap;
myMap.emplace(3, "orange");

emplace函数是C++11引入的新特性,可以在插入时直接构造键值对。 需要注意的是,如果插入的键已经存在于map中,则insert函数不会插入新的键值对,而是返回一个std::pair类型的迭代器,指向已经存在的键值对。

  • 使用迭代器对一组数据进行插入

 string str[10] = { "数据1","数据2","数据3" ,"数据4" ,
  "数据5" ,"数据6" ,"数据7" ,"数据8" ,"数据9" ,"数据10" };
 vector<pair<string, int>> p1 = { {"数据1",1},{"数据2",2}, {"数据3",3}, {"数据4",4} ,{"数据5",5} ,{"数据6",6} ,{"数据7",7} ,{"数据8",8} ,{"数据9",9}, {"数据10",10} };
 mp1.insert(p1.begin(),p1.end());


只需要给定数据容器的迭代器,编译器便会遍历插入

erase

  • map的erase函数用于删除map中指定键对应的元素。它提供了多个重载版本,可以根据不同的需求进行使用。

  • 删除单个键值对:

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
myMap.erase(1);

上述代码将删除键为1的键值对。调用erase函数时,传入要删除的键作为参数。

  • 使用迭代器删除元素:

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
auto it = myMap.find(1);
if (it != myMap.end()) {
    myMap.erase(it);
}

上述代码通过先使用find函数查找到要删除的键对应的迭代器,然后调用erase函数来删除元素。

  • 删除一定范围内的元素:

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
myMap.insert(std::make_pair(3, "orange"));
myMap.erase(myMap.begin(), myMap.find(2));

find接口的使用

  • map的find函数用于在map中查找指定键对应的元素。它返回一个迭代器,指向该键对应的元素,如果键不存在,则返回end迭代器。

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
myMap.insert(std::make_pair(3, "orange"));
auto it = myMap.find(2);
if (it != myMap.end()) {
    std::cout << "Key found! Value is: " << it->second << std::endl;
} else {
    std::cout << "Key not found!" << std::endl;
}
  • 上述代码中,我们创建了一个map,并向其中插入了一些键值对。然后,使用find函数查找键为2的元素。如果找到了该键,打印对应的值;如果未找到,输出"Key not found!"。find函数返回的是一个迭代器,指向找到的元素。如果键不存在于map中,则返回end迭代器,它指向map中最后一个元素之后的位置。

clear接口的使用

  • map的clear函数用于删除map中的所有元素,使其成为空map。使用clear函数不会改变map的容量,只是将其中的键值对全部删除。

std::map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "apple"));
myMap.insert(std::make_pair(2, "banana"));
myMap.insert(std::make_pair(3, "orange"));
myMap.clear();

上述代码中,我们创建了一个map,并向其中插入了一些键值对。然后,调用clear函数将所有元素都删除。

map的应用

  • 当成计数数组使用

  • 快速查找

set的使用

set的介绍

  • STL中的set是一种有序的关联容器

  • 它基于红黑树的数据结构实现。

  • set的特点如下:

  1. 唯一性:set中的元素是唯一的,不允许重复。如果尝试向set中添加已经存在的元素,操作将被忽略。

  2. 有序性:set中的元素按照一定的顺序进行存储,默认情况下是升序排列。可以通过自定义比较函数来改变排序方式。

  3. 快速插入与删除:set对插入和删除操作具有高效性能。红黑树结构可以自动调整以保持平衡,从而保证了常数时间复杂度的插入和删除操作。

  4. 快速查找:set内部使用二叉搜索树(红黑树)实现,使得查找操作具有很高的效率。平均情况下的时间复杂度为O(log n)。

  5. 提供迭代器支持:可以使用迭代器遍历set中的元素,支持正向和反向迭代。

insert接口的介绍

  • 可以使用insert()方法向set中添加元素。如果添加的元素已经存在于set中,则不会有任何变化。

mySet.insert(4);  // 添加元素4到set中

erase和clear接口的介绍

  • 可以使用erase()方法从set中删除指定的元素。如果指定的元素不存在于set中,不会有任何变化。另外,还可以使用clear()方法清空set中的所有元素。

mySet.erase(3);  // 从set中删除元素3
mySet.clear();  // 清空set中的所有元素

find接口的介绍

  • 可以使用find()方法来查找set中的元素。如果找到了指定元素,返回指向该元素的迭代器;否则返回set的end()迭代器。

auto it = mySet.find(2);  // 查找元素2
if (it != mySet.end()) 
{
    // 元素存在
} 
else 
{
    // 元素不存在
}

set的应用

  • 它在去重、成员关系判断和集合运算等方面都有广泛的应用。

  • 要注意,set对于元素的插入和删除操作会导致树结构的调整,因此在某些情况下可能比unordered_set(哈希表实现)慢一些。

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值