map<string,long>::iterator iter; iter=phonebook.begin();
while (iter != phonebook.end()){
if(name==(*itr).first){
cout<<(*itr).first<<"="<<(*itr).second<<endl;
c=1;
break;
}
这段代码抛出这个错误:
[Error] no match for 'operator=' (operand types are 'std::map<std::basic_string<char>, long int>::iterator {aka std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, long int> >}'
and 'std::map<std::basic_string<char>, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, int> >}')
在初始化变量时,您忘记为" iter"设置类型了。所以应该是
map<string, long>::iterator iter = phonebook.begin();
但是,以这种方式初始化迭代器非常耗时。因此,按照目前的标准,最好实现"自动"。关键字
auto iter = phonebook.begin();
"auto"将根据表达式右侧的类型设置给定变量的类型。
为了使它更好,您可以使用大括号初始化
auto iter { phonebook.begin() };
从错误信息中可以清楚地看出,您的phonebook
没有声明为map<string,long>
,而是实际上声明为map<string,int>
,因此您需要相应地更改迭代器的声明:
map<string,int>::iterator iter = phonebook.begin();
while (iter != phonebook.end()) {
if (name == (*itr).first) {
cout << (*itr).first << "=" << (*itr).second << endl;
c = 1;
break;
}
long
和int
是不同的类型,因此map<string,long>
和map<string,int>
是不同的容器类型。不能混合使用来自不同容器类型的迭代器。
一个更好的解决方案是使用auto
,让编译器推断出要使用的迭代器的类型:
auto iter = phonebook.begin();
while (iter != phonebook.end()) {
if (name == itr->first) {
cout << itr->first << "=" << itr->second << endl;
c = 1;
break;
}
可以通过使用range-for循环来进一步简化:
for(const auto &elem : phonebook()) {
if (name == elem.first) {
cout << elem.first << "=" << elem.second << endl;
c = 1;
break;
}
然而,你的循环在第一个匹配元素上是break
的,所以你应该考虑使用标准的std::find_if()
算法来代替循环,例如:
auto iter = std::find_if(phonebook.begin(), phonebook.end(),
[&](const auto &elem){ return name == elem.first; }
);
if (iter != phonebook.end()) {
cout << iter->first << "=" << iter->second << endl;
c = 1;
}