为什么我不能使用ranged for循环打印对象的向量内容?

问题描述 投票:1回答:1

我是一个初学者,我解决了一个涉及10个吃派者的练习,吃派的数量由用户输入设置。

  1. 第1个任务是:显示参赛者人数和吃的馅饼数量。显示参赛者人数和吃过的馅饼--解决了。
  2. 第2个任务: 找出吃馅饼最多的优胜者,并列出所有优胜者--已解决。
  3. 第3个任务:找出吃派最少的输家,并列出所有输家--已解决;第3个任务:找出吃派最少的输家,并列出所有输家--已解决。第三项任务:找出吃派最少的输家,并列出所有输家--解决。
  4. 最后一个任务:对参赛者进行排序,并列出他们的名单--解决;最后一个任务:找到吃派最少的失败者,并列出他们的名单--解决;最后一个任务:找到吃派最少的失败者,并列出他们的名单--解决。按照吃馅饼最多到最少的顺序对参赛者进行排序,并列出他们的名单--部分解决。

我做了所有的事情,没有错误或警告(甚至在调试器中显示向量被正确排序),但是当我试图打印出排序后的向量时,控制台屏幕就不会再显示任何东西(甚至连程序执行结束的标准信息也没有)。

我做了一个Constructor Contestant类,有两个参数,并声明了一个对象的向量。下面是main、类头和类解决方案的代码。

#include <iostream>
#include <vector>
#include "Contestant.h"
using namespace std;

int main()
{
    cout << "Type the number of pies eaten by each of the 10 contestants:" << endl;
    cout << "#1 #2 #3 #4 #5 #6 #7 #8 #9 #10" << endl;

    vector<Contestant> pie_eaters;
    vector<Contestant*> winners; 
    vector<Contestant*> losers; 


    for (int i=0; i<10; i++)
    {
       int pies_eaten;
       cin >> pies_eaten;
       pie_eaters.emplace_back(i+1, pies_eaten);
       cout << "Contestant number " << i+1 << " ate " << pie_eaters[i].GetPancakes() << endl;
    }
    cout << endl;


    FindWinners(pie_eaters, winners);
    ListWinners(winners);

    FindLosers(pie_eaters, losers);
    ListLosers(losers);


    cout << endl;

    SortPieEaters(pie_eaters);

    ListSortedPieEaters(pie_eaters);


}

Class header (编辑过了,只是排序和打印出来的部分,这些都在类外):

#pragma once
#include <iostream>
#include <vector>

class Contestant
{
private: 
    int pancakes_eaten;
    int number;

public:
    Contestant(int number, int pancakes);

    ~Contestant();
    int GetPancakes() const { return pancakes_eaten; }
    int GetNumber() const { return number; }

};


void SortPieEaters(std::vector<Contestant>& pie_eaters);

void ListSortedPieEaters(std::vector<Contestant> const& pie_eaters);

和类解决方案(只是排序和打印部分,在类外):

#include "Contestant.h"

using namespace std;

Contestant::Contestant(int number, int pancakes) : pancakes_eaten(pancakes), number(number)
{
}

Contestant::~Contestant() {};


void SortPieEaters(vector<Contestant>& pie_eaters)
{
    while(bool swapped=true)
        {
        swapped = false;
           for (int i = 0; i < static_cast<int>(pie_eaters.size()-1); i++)
           {
                if (pie_eaters[i].GetPancakes() < pie_eaters[i + 1].GetPancakes())
                {
                    swap(pie_eaters[i], pie_eaters[i + 1]);
                    swapped = true;
                }

           }
        }
}

void ListSortedPieEaters(vector<Contestant> const& pie_eaters)
{
    cout << "From most pies eaten, to fewest pies eaten, the results are as follows:" << endl;
    for (auto const& c : pie_eaters)
    {
        cout << "Contestant #" << c.GetNumber() << ": ate " << c.GetPancakes() << " pies" <<endl;

    }
}

最后,这里是输出示例。输出

一切都很好,但它不会打印出矢量,也不会警告它有任何问题。试过了,所有的东西都试过了,比如通过常量或非常量引用,试过直接在main中写函数的主体(避开函数),但什么都没有.而且访问向量和打印出来的内容和胜者和败者向量的情况是一样的(尽管它们是指向吃饼者向量的对象元素的向量

我做错了什么?

c++ vector output cout ranged-loops
1个回答
0
投票

这是因为while循环永远不会结束,因为你已经初始化了这个值。swapped = true 在while循环条件下, swapped 变成真,当内部的for循环结束,while循环被重新处理。

因此,这行程序永远不会离开while循环。

SortPieEaters(pie_eaters); //Executes

ListSortedPieEaters(pie_eaters); //does not execute

你可以直接做

bool swapped = true;
while(swapped)
{
    swapped = false;
    for (int i = 0; i < static_cast<int>(pie_eaters.size()-1); i++)
    {
        if (pie_eaters[i].GetPancakes() < pie_eaters[i + 1].GetPancakes())
        {
            swap(pie_eaters[i], pie_eaters[i + 1]);
            swapped = true;
        }
    }
}

另外,我建议你把你的排序逻辑改成更简单的,在 Contestant 类和使用 std::sort 而是

© www.soinside.com 2019 - 2024. All rights reserved.