C++ 如何从自定义对象列表中按id/name属性查询指定对象并输出数据
问题原因
- 1 死循环问题:主函数的while循环中,迭代器自增
iterador++仅写在了if匹配成功的分支内,若当前遍历对象不匹配,迭代器永远不会向后移动,程序会卡在遍历第一个元素的位置,永远不会进入匹配分支也不会退出循环,这是没有输出的核心原因。 - 2 成员函数语法&逻辑错误:
- City.cpp的
setId函数逻辑完全错误,不存在nombre变量,且本该给成员变量id赋值,代码写为nombre=name,完全不符合功能预期 - City.cpp的
setName函数中,参数是驼峰命名的newName,赋值时写为全小写的newname,C++大小写敏感,编译会直接报错
- City.cpp的
- 3 需求与实现逻辑不符:你需要按指定Id查询对象,现有代码判断的是
getName()相等,和需求完全偏离 - 4 输出字段颠倒:匹配成功后,
Name字段后输出的是getId()返回值,Id字段后输出的是getName()返回值,即使匹配成功输出内容也是错乱的
修正后代码
City.h 无需修改
City.cpp 修正后:
//constructors City::City() { } City::City(string newId,string newName) { id=newId; name=newName; } //functions to get and set data string City::getId(){ return id; } void City::setId(string newId){ // 修正赋值逻辑 id = newId; } string City::getName(){ return name; } void City::setName(string newName){ // 修正参数大小写错误 name = newName; }
主函数修正后(支持按Id查询,修复死循环):
#include <iostream> #include <list> #include <string> #include <algorithm> using namespace std; int main () { City c1("C001","Barcelona"); City c2("C002","New York"); City c3("C003","San Andres"); list<City> listcity; listcity.push_back(c1); listcity.push_back(c2); listcity.push_back(c3); string targetId; cin>>targetId; // 方案1:修复原生遍历逻辑 list<City>::iterator iterador=listcity.begin(); list<City>::iterator iteradorfinal=listcity.end(); while(iterador != iteradorfinal){ // 按Id匹配符合需求 if(iterador->getId() == targetId){ cout<<"Name: "; cout<< iterador->getName()<<endl; cout<<"Id: "; cout<< iterador->getId()<<endl; cout<<"------------------------------------------------------------"<<endl; break; } // 迭代器自增移到if分支外 iterador++; } // 方案2:更简洁的find_if实现,适配自定义对象查询场景 auto res = find_if(listcity.begin(), listcity.end(), [&targetId](const City& city){ return city.getId() == targetId; }); if(res != listcity.end()){ cout<<"Name: "; cout<< res->getName()<<endl; cout<<"Id: "; cout<< res->getId()<<endl; cout<<"------------------------------------------------------------"<<endl; } return 0; }
内容的提问来源于stack exchange,提问作者julio mendoza
相关产品推荐
相关产品推荐

