STL标准库(四) 关联容器

本文详细介绍了C++中的set和map关联容器,包括它们基于的红黑树和哈希表实现,以及set(无序/有序)、multiset(多重)、unordered_set、unordered_multiset、map(映射/有序)、multimap(多重/有序)和unordered_map的区别,展示了如何创建、插入、删除和遍历这些容器。
摘要由CSDN通过智能技术生成

关联容器主要有两类 set和map,都属于双向迭代器

set关联器

set 集合 基于平衡二叉树(红黑树)存储,元素值唯一且有序

multiset 多重集合 基于平衡二叉树(红黑树)存储,元素值可以重复

unordered_set 无序集合 基于哈希表 无序的,但是元素值唯一,使用时需要包含头文件

<unordered_set>

以上三个功能基本一致,只是内部实现有所不同

unordered_multiset 多重无序集合

如下一个程序演示set关联容器

#include <set> 需要包含该头文件

template <typename T>

void print(T Begin, T end)

{

    for (T i = Begin; i != end; ++i)

    {

       std::cout << *i << std::endl;

    }

    std::cout << std::endl;

}

int main()

{

    std::set<int> obj = {5,6444,54,84,452}; 创建一个set容器,元素在插入该容器时自动排列

    for (auto i = obj.begin(); i != obj.end(); i++) 遍历该容器

    {

        std::cout << *i << std::endl; 打印元素值

    }

结果发现,从小到大打印,证明容器元素是有序的

    std::set<int> objB(obj.begin(), obj.end()); 迭代器方式拷贝构造

元素从obj容器的开始到结尾全部拷贝

    objB.erase(84); 删除该容器中84的值

    objB.erase(objB.begin());删除某个迭代器指向的位置

    objB.erase(objB.begin(), objB.end()); 删除某个迭代器指向的位置到另一个迭代器指向的位置

    objB.insert(999); 插入999

    if (objB.insert(999).second)   second用来判断插入元素后,该元素在容器中个数,如果为1则返

回ture,如果为2则返回false

    {

       std::cout << "insert success" << std::endl;

    }

    else

    {

       std::cout << "insert failed" << std::endl;

    }

    if (objB.find(12) != objB.end())  遍历查找元素,如果返回false意味着容器元素都查找了一遍,没

有找到要查找的元素,查找失败

    {

       std::cout << "find success" << std::endl;

    }

    else

    {

       std::cout << "find failed" << std::endl;

    }

    for (auto i = objB.rbegin(); i != objB.rend(); i++)   反向遍历

    {

       std::cout << *i << std::endl;

    }

    print(objB.begin(),objB.end()); 可以应用模板函数遍历

    system("pause");

    return 0;

}

map关联器

map 映射/地图 基于平衡二叉树(红黑树)存储 key:value(用key查找value) key是唯一的,但是

value可以重复

multimap 多重映射 基于平衡二叉树(红黑树)存储 key不唯一,value不唯一,但是有序

unordered_map 无序集合 哈希表 无序,但是key唯一

unordered_multimap 多重无序映射

map和set的方法一样,区别在于map允许重复元素

如下一个程序进行展示

#include <map> 应用map需要的头文件

#include <unordered_map> 应用unordered_map需要的头文件

int main()

{

    std::pair<int, std::string> p1 = { 4,"DDDDDD" }; C++以此结构存储两个类型的变量

    std:: map<int, std::string> obj = { {1,"AAA"} ,{2,"BBBB"},{3,"CCCC"} }; 创建一个map,可以认为

是pair的集合

    obj.insert(p1); map通过插入pair进行插入元素

    std::pair<int, std::string> p2; 另一种创建pair的方法

    p2.first = 5;

    p2.second = "EEEEE";

    obj.insert(p2);

    std::pair<int, std::string> p3 = std::make_pair(6, "FFFFF"); 第三种创建pair的方法

    obj.insert(p3);

    auto p4 = obj.find(5);  p4接受返回一个迭代器,指向key = 5所在的位置

    *p4的值为key = 5所在位置的pair这个结构

    auto p5 = *p4;

    std::cout << p5.first << "\t" << p5.second << std::endl; 打印p5结构的第一个元素和第二个元素

    obj.erase(4); 删除key为4的元素

    obj.erase(obj.begin()); 删除头元素

    obj.erase(obj.begin(), obj.end()); 删除指定范围元素

    obj.clear(); 清空

    for (auto i = obj.begin(); i != obj.end(); i++) 遍历打印元素,也可反向遍历打印  

    {

       std::cout << i->first << "\t" << i->second << std::endl;

    }

    system("pause");

    return 0;

}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值