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 ;
} 学习了... 简单写了几句,注意迭代器是否有效以及不要做重复遍历的事情
学习了。。。。。 小小少年爬山坡 发表于 2020-6-2 18:34
简单写了几句,注意迭代器是否有效以及不要做重复遍历的事情
这算一种,只是奇怪map.find()为什么不能设置起始位置,是不是要重载find() 本帖最后由 小小少年爬山坡 于 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";
});
说实话没人会这么做,本末倒置的事情,这里只是写出来给你做一个参考和学习
小小少年爬山坡 发表于 2020-6-3 16:49
不要尝试重载或修改标准库里的东西。
std::map::find的查找复杂度为logn , 所以没有必要设置起始
嗯,复杂度变高就没有意义了。
受教,感谢大佬! sam喵喵 发表于 2020-6-3 17:06
嗯,复杂度变高就没有意义了。
受教,感谢大佬!
当然,复杂度不是唯一的评判标准
典型的例子就是KMP算法 也称课本算法,虽然时间复杂度比暴力低,
但是实际日常使用时远远没有暴力来得快。
当然也可以考虑std::search 内部实现是BM(c++17起) 小小少年爬山坡 发表于 2020-6-4 09:09
当然,复杂度不是唯一的评判标准
典型的例子就是KMP算法 也称课本算法,虽然时间复杂度比暴力低,
没怎么用暴力破解,每次开车出门或者上高速, 后面都跟着辆信号车。
页:
[1]