繁体   English   中英

For循环迭代器问题C ++

[英]For loop iterator issues c++

我在获取代码引发运行时错误以及使这些循环正常工作时遇到问题,我不确定为什么。

如果用户要输入名称和余额,例如:josh 100,则程序应将100添加到listAccounts向量中名为josh的帐户,然后打印新余额。

关于该行的内容:for(; iter!= listAccounts.end(); iter ++){

由于某种原因,这会导致if语句不起作用,如果我将该行注释掉,该功能将起作用,但仅对listAccounts中的最后一个元素起作用。 for循环是否有问题,导致其无法单步执行每个元素?

void Account::change_balance(string name, int balance, int i) {
    try {
        auto iter = listAccounts.begin();

        for ( ; iter !=  listAccounts.end(); iter++) {

            if ((*iter).account_name == name) {
                if (((*iter).account_type == 0) && (((*iter).account_balance + 
                balance) < 0)) {
                    throw runtime_error("account cannot hold negative 
                    balance");                    
                    (*iter).account_balance = (((*iter).account_balance) -
                    (balance));
                    cout << (*iter).account_balance;                                                
                } else {                                                                            
                    (*iter).account_balance = balance + 
                    (*iter).account_balance;
                    cout << (*iter).account_balance;
                }
            }
        }
    }
    catch (runtime_error& e) {         
        cout << "error on line " << i << ": " << e.what() << "\n"; 
    }
}

我无法弄清楚哪里出了问题,任何指示将不胜感激。 谢谢。

检查您的内部循环。 您永远不会增加迭代器,您要做的就是将listAccounts.size()与向量的相同元素与function参数进行比较。 由于循环在k == listAccounts.size()时结束,因此只有当外部循环至少进行另一轮运行时,才能满足条件n == listAccounts.size(),因为您没有清除n(或在本地定义n) )。 但是现在,它可能会触发并说“找不到帐户”,即使它在那里,因为n == listAccounts.size()。 这不是您想要的行为。

您应该重新考虑算法。 为什么每次遍历帐户列表时都遍历所有帐户? 一次就足够了。 考虑做这样的事情:

for(auto& account : listAccounts) {
   if(account.account_name == name) {
      // do your logic stuff and eventually:
      return;
   }
}
// if your program gets here, no account with such a name was found

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM