sam喵喵 发表于 2020-6-2 17:32

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

初学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

简单写了几句,注意迭代器是否有效以及不要做重复遍历的事情

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):

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算法 也称课本算法,虽然时间复杂度比暴力低,


没怎么用暴力破解,每次开车出门或者上高速, 后面都跟着辆信号车。
页: [1]
查看完整版本: C++输出map容器中所有相同value元素的若干方法