吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2252|回复: 8
收起左侧

[C&C++ 转载] C++输出map容器中所有相同value元素的若干方法

[复制链接]
sam喵喵 发表于 2020-6-2 17:32
初学C++,遇到这一问题。网上Java版本的一堆,C++版本的很少见,特此分享出来。
欢迎大神补充。
#include<iostream>
using namespace std;
#include"map"
#include"string"
class Person
{
public:
        string name;
        int age;
        string tel;
        double salary;
};
void test01()
{
        Person p1, p2, p3, p4, p5;
        p1.name = "王1";
        p1.age = 31;

        p2.name = "王2";
        p2.age = 32;
        p3.name = "张3";
        p3.age = 33;
        p4.name = "张4";
        p4.age = 34;  
        p5.name = "赵5";

        multimap<string, Person>map2;
        map2.insert(make_pair("sale", p1));
        map2.insert(make_pair("sale", p2));

        map2.insert(make_pair("development", p3));
        map2.insert(make_pair("development", p4));

        map2.insert(make_pair("Financial", p5));

        for (multimap<string, Person>::iterator it = map2.begin(); it != map2.end(); it++)
        {
                cout << it->first << "\t" << it->second.name << endl;
        }
        cout << "遍历结束" << endl;
       
        cout << "development部分人数:  " << map2.count("development") << endl;
        cout << "development部门员工信息" << endl;
        multimap<string, Person>::iterator it2 = map2.find("development");
        //multimap<string, Person>::iterator it2;
        //第一种方法输出某一部们的所有人
        //int num2 = map2.count("development");
        //int tag = 0;
        //while (it2 != map2.end()&&tag<num2)
        //{
        //        //it2 = map2.find("development");
        //        string tmp = it2->first;
        //        cout << it2->first << "\t" << it2->second.name << endl;
        //        it2++;
        //        tag++;
        //}
        //第二种方法输出某一部们的所有人
        string tmp = it2->first;
        while (it2 != map2.end())
        {
                cout << it2->first << "\t" << it2->second.name << endl;
                it2++;
                if (it2->first!= tmp)//如果不是同一部门就中断退出
                {
                        break;
                }
        }
}

void main()
{
        test01();
        system("pause");
        return ;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

quanrong 发表于 2020-6-2 18:02
学习了...
小小少年爬山坡 发表于 2020-6-2 18:34
简单写了几句,注意迭代器是否有效以及不要做重复遍历的事情

Snipaste_2020-06-02_18-34-09.jpg
jefel 发表于 2020-6-2 18:47
 楼主| sam喵喵 发表于 2020-6-3 09:24
小小少年爬山坡 发表于 2020-6-2 18:34
简单写了几句,注意迭代器是否有效以及不要做重复遍历的事情

这算一种,只是奇怪map.find()为什么不能设置起始位置,是不是要重载find()
小小少年爬山坡 发表于 2020-6-3 16:49
本帖最后由 小小少年爬山坡 于 2020-6-4 09:04 编辑
sam喵喵 发表于 2020-6-3 09:24
这算一种,只是奇怪map.find()为什么不能设置起始位置,是不是要重载find()

不要尝试重载或修改标准库里的东西。

std::map::find的查找复杂度为logn , 所以没有必要设置起始

基于你非要设起始的话可以考虑 std::find_if , 但是遗憾的是 复杂度就会提高到n

大概方式如下(基于c++11):

[C++] 纯文本查看 复制代码
auto key_val = std::find_if(map.begin(), map.end(), [](decltype(*map.begin())& it) -> bool
{
    return it.first == "123";
});


说实话没人会这么做,本末倒置的事情,这里只是写出来给你做一个参考和学习
 楼主| sam喵喵 发表于 2020-6-3 17:06
小小少年爬山坡 发表于 2020-6-3 16:49
不要尝试重载或修改标准库里的东西。

std::map::find的查找复杂度为logn , 所以没有必要设置起始

嗯,复杂度变高就没有意义了。
受教,感谢大佬!
小小少年爬山坡 发表于 2020-6-4 09:09
sam喵喵 发表于 2020-6-3 17:06
嗯,复杂度变高就没有意义了。
受教,感谢大佬!

当然,复杂度不是唯一的评判标准

典型的例子就是KMP算法 也称课本算法,虽然时间复杂度比暴力低,

但是实际日常使用时远远没有暴力来得快。

当然也可以考虑std::search 内部实现是BM(c++17起)
 楼主| sam喵喵 发表于 2020-6-4 11:15
小小少年爬山坡 发表于 2020-6-4 09:09
当然,复杂度不是唯一的评判标准

典型的例子就是KMP算法 也称课本算法,虽然时间复杂度比暴力低,

没怎么用暴力破解,每次开车出门或者上高速, 后面都跟着辆信号车。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-29 16:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表