【STL学习】容器篇-关联容器

关联容器有4种:

set multiset map multimap

关联容器内部实现为红黑树。
与关联容器密切相关的有个数据类型为pair(键值对)
pair < T,T > 该数据类型为一个模板类,存储两个变量。成员变量firist和second分别为pair的第一个值和第二个值。


set:
存储的的值为一个键,具有唯一性;不可重复。
set的插入,返回值为一个pair。第一个值为iterator,代表插入位置的迭代器,第二个值为bool,代表是否插入成功。
测试代码

void Test()
{
    set<string> setTest;
    setTest.insert("1.相同值插入Test");
    setTest.insert("5.这个第二个插入");
    setTest.insert("2.这个第三个插入");
    if (setTest.insert("1.相同值插入Test").second == false)
    {  //这里插入于第一个插入相同的值,测试返回值
        cout << "键重复插入失败\n"; 
    }

    cout << "Ergodic:";
    for (auto str : setTest)
    { //遍历容器
        cout << str << endl;
    }
    cout << endl;

    cout << " ---------插入位置Test:---------\n";
    for (auto it = setTest.insert("3.这个最后插入").first; 
        it != setTest.end(); ++it)
    {//测试first 为插入位置的迭代器。
        cout << *it << endl;
    }
}

输出结果:
这里写图片描述
可以看出set插入的会自动排序。
ps:还可以在插入的时候多一个迭代器的参数,容器会先检查传入的迭代器指向的位置是否合法(在知道插入位置的情况下,这样使用可以提高插入效率)。如果位置不合法,那么将不会插入到传入迭代器指向的位置。

set的查找:
ps:set的find函数是不可以用迭代器进行查找的,只能按值查找;
set.find(Value); 返回值为查找到的值的位置的迭代器。没有找到返回end();


multiset:
multiset 可以重复键值, 也会自动排序。
multiset基本与set相同 但是insert返回值为插入位置的迭代器,不是pair。
multiset需要注意的是find,共有3种方式可以读出所有的要查找的值:
测试代码:

void Test()
{
    multiset<int> setTest;
    setTest.insert(1);
    setTest.insert(1);
    setTest.insert(2);
    setTest.insert(3);
    setTest.insert(5);
    setTest.insert(3);
    setTest.insert(1);
    setTest.insert(5);

    cout << "方法一:\n";
    int iCount=setTest.count(1);//获得1这个键的个数
    multiset<int>::iterator it = setTest.find(1);//find会返回第一个键的位置的迭代器
    for (int i = 0; i < iCount; ++i, ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    cout << "方法二:\n";
    auto it_beg = setTest.lower_bound(3); //第一个等于该值的位置,如果没有返回最后一个下雨该值的位置
    multiset<int>::iterator it_end = setTest.upper_bound(3); //第一个大于该值的位置
    for (; it_beg != it_end; ++it_beg)
    {
        cout << *it_beg << " ";
    }
    cout << endl;

    cout << "方法三:\n";
    pair<multiset<int>::iterator, multiset<int>::iterator> itPair;
    itPair = setTest.equal_range(5); //返回两个迭代器,就是lower_bound和upper_bound的返回值
    for (; itPair.first != itPair.second; ++itPair.first)
    {
        cout << *itPair.first << " ";
    }
    cout << endl;
}

测试结果这里写图片描述

map和multimap 于set大体类似,
主要差别就是map存储的是键值对,但是访问,比较等。还是依靠键值。不在赘述。
ps:不建议使用[]下标访问map。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值