跪求大神指点一个关于C++ STL map 查找关键字的问题
#include<map>#include<utility>#include<iostream>usingnamespacestd;intmain(){intmark=0...
#include <map>
#include <utility>
#include <iostream>
using namespace std;
int main()
{
int mark=0;
char ch[10];
//使用pair实现数据插入
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1, "张三"));
mapStudent.insert(pair<int, string>(2, "李四"));
map<int, string>::iterator iter;//定义个迭代器
cout<<"search:";
cin>>ch;//输入要查找的学生姓名
iter=mapStudent.find(1); //这种方法是按学号查找
if(iter!=mapStudent.end())
cout<<iter->second<<"的学号是:"<<iter->first<<endl;
else
cout<<"no "<<ch<<endl;
if(mapStudent.count(ch)) //这种方法是按姓名查找,问题就在这
// 提示错误
cout<<mapStudent[ch] <<endl;
return 0;
}
我想问的就是,我现在map类型是先int后string。我怎么做到,输入一个ch(学生姓名),然后找出这个学生有没有在map里,并且输出他的学号。而不是输入学号,找出这个学生。
跪求大神给我个解决方法,最后简要的和我说下原理,和我错误的原因。小弟初学者。 展开
#include <utility>
#include <iostream>
using namespace std;
int main()
{
int mark=0;
char ch[10];
//使用pair实现数据插入
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1, "张三"));
mapStudent.insert(pair<int, string>(2, "李四"));
map<int, string>::iterator iter;//定义个迭代器
cout<<"search:";
cin>>ch;//输入要查找的学生姓名
iter=mapStudent.find(1); //这种方法是按学号查找
if(iter!=mapStudent.end())
cout<<iter->second<<"的学号是:"<<iter->first<<endl;
else
cout<<"no "<<ch<<endl;
if(mapStudent.count(ch)) //这种方法是按姓名查找,问题就在这
// 提示错误
cout<<mapStudent[ch] <<endl;
return 0;
}
我想问的就是,我现在map类型是先int后string。我怎么做到,输入一个ch(学生姓名),然后找出这个学生有没有在map里,并且输出他的学号。而不是输入学号,找出这个学生。
跪求大神给我个解决方法,最后简要的和我说下原理,和我错误的原因。小弟初学者。 展开
2个回答
展开全部
首先,应该查找键。你写<int,string>把学号作为键,却查找的是姓名值,就浪费了这个数据结构的效率。应该<string, int> 姓名-学号对应,查姓名,直接出学号。。
#include <iostream>
#include <map>
using namespace std;
int main()
{
char ch[10];
map<string, int> m;
m.insert(pair<string,int>("张三",1));
m.insert(pair<string,int>("李四",2));
m.insert(pair<string,int>("king",3));
cout<<"search:";
cin>>ch;
map<string,int>::iterator iter;//定义个迭代器
iter=m.find(ch); //这种方法是按学号查找
if(iter!=m.end())
cout<<iter->second<<"的学号是:"<<iter->first<<endl;
else
cout<<"no "<<ch<<endl;
if(m.count(ch)) //这种方法是按姓名查找,问题就在这
// 提示错误
cout<<m[ch] <<endl;
return 0;
return 0;
}
#include <iostream>
#include <map>
using namespace std;
int main()
{
char ch[10];
map<string, int> m;
m.insert(pair<string,int>("张三",1));
m.insert(pair<string,int>("李四",2));
m.insert(pair<string,int>("king",3));
cout<<"search:";
cin>>ch;
map<string,int>::iterator iter;//定义个迭代器
iter=m.find(ch); //这种方法是按学号查找
if(iter!=m.end())
cout<<iter->second<<"的学号是:"<<iter->first<<endl;
else
cout<<"no "<<ch<<endl;
if(m.count(ch)) //这种方法是按姓名查找,问题就在这
// 提示错误
cout<<m[ch] <<endl;
return 0;
return 0;
}
追问
那如果我要提供两种功能,姓名查找方式和学号查找方式怎么办?
展开全部
map是看成一种<key , value>的键值对,你可以用一个迭代器对这个map进行遍历,对每个 map 的value(也就是iter->second)与你输入的姓名比较,如果相同输出学号(iter->first)。
你错误的原因是 map 中的 count方法参数是 它的 key, 而你传的实际上是 value,类型不对,而且这个方法是计算与key相同的数量
你错误的原因是 map 中的 count方法参数是 它的 key, 而你传的实际上是 value,类型不对,而且这个方法是计算与key相同的数量
追问
我就是不懂怎么比较value与我输入的姓名的语法.
一直提示:error C2664: 'strcmp' : cannot convert parameter 1 from 'class std::basic_string,class std::allocator >' to 'const char *'
追答
的count()方法的参数是 map 的key, 不是value,返回的是与key相同的键值对数量,你的if(mapStudent.count(ch))是什么意思,肯定错,可以用迭代器遍历,比较每一个value与你输入的ch才行,然后输出才行的。
你的那个错误是strcmp方法传的参数不合法的问题
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询