You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ 如何从自定义对象列表中按id/name属性查询指定对象并输出数据

问题原因

  • 1 死循环问题:主函数的while循环中,迭代器自增iterador++仅写在了if匹配成功的分支内,若当前遍历对象不匹配,迭代器永远不会向后移动,程序会卡在遍历第一个元素的位置,永远不会进入匹配分支也不会退出循环,这是没有输出的核心原因。
  • 2 成员函数语法&逻辑错误:
    • City.cpp的setId函数逻辑完全错误,不存在nombre变量,且本该给成员变量id赋值,代码写为nombre=name,完全不符合功能预期
    • City.cpp的setName函数中,参数是驼峰命名的newName,赋值时写为全小写的newname,C++大小写敏感,编译会直接报错
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 09:45:02