为什么我不能使用范围 for 循环打印 objects 向量的内容?
Why can't I print contents of vector of objects using a ranged for loop?
我是初学者,我解决了一个涉及 10 个吃馅饼的练习,吃的馅饼数量由用户输入设置。
- 第一个任务:显示参赛者人数和吃的馅饼 - 已解决;
- 第二个任务:找到吃馅饼最多的赢家并列出所有 - 已解决;
- 第三个任务:找到吃馅饼最少的失败者并列出所有失败者 - 已解决;
- 最后的任务:对参赛者进行排序,并按照馅饼最多的顺序列出他们
吃最少的馅饼 - 部分解决。
我什么都做了,没有错误或警告(甚至在调试器中单步执行/进入显示矢量已正确排序),但就在我尝试打印出已排序的矢量时,控制台屏幕不会显示更多(甚至不是程序执行完成的标准消息)。
我用带有两个参数的构造函数 Contestant 创建了一个 Contestant class,并声明了一个 object 的向量。这是主要的代码,class header 和 class 解决方案:
#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(已编辑,整理打印出来,在class之外):
#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);
和Class解决方案(只是排序和打印部分,在class之外):
#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;
}
}
最后,这里是示例输出:
Output
一切正常,但它不会打印出矢量或警告它有任何问题。尝试过,一切都像通过常量或 non-constant 引用传递,尝试直接在 main 中编写函数的 body (避免函数),但没有。
访问向量并打印出内容与赢家和输家向量的情况相同(即使它们是指向吃饼者向量的 object 元素的指针向量)
我做错了什么?
那是因为while循环永远不会结束,因为你已经在while循环条件中初始化了swapped = true
的值,当内部for循环结束并且swapped
的值变为真时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
class 中重载 < 并使用 std::sort
代替
来将排序逻辑更改为更简单的东西
我是初学者,我解决了一个涉及 10 个吃馅饼的练习,吃的馅饼数量由用户输入设置。
- 第一个任务:显示参赛者人数和吃的馅饼 - 已解决;
- 第二个任务:找到吃馅饼最多的赢家并列出所有 - 已解决;
- 第三个任务:找到吃馅饼最少的失败者并列出所有失败者 - 已解决;
- 最后的任务:对参赛者进行排序,并按照馅饼最多的顺序列出他们 吃最少的馅饼 - 部分解决。
我什么都做了,没有错误或警告(甚至在调试器中单步执行/进入显示矢量已正确排序),但就在我尝试打印出已排序的矢量时,控制台屏幕不会显示更多(甚至不是程序执行完成的标准消息)。
我用带有两个参数的构造函数 Contestant 创建了一个 Contestant class,并声明了一个 object 的向量。这是主要的代码,class header 和 class 解决方案:
#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(已编辑,整理打印出来,在class之外):
#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);
和Class解决方案(只是排序和打印部分,在class之外):
#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;
}
}
最后,这里是示例输出: Output
一切正常,但它不会打印出矢量或警告它有任何问题。尝试过,一切都像通过常量或 non-constant 引用传递,尝试直接在 main 中编写函数的 body (避免函数),但没有。 访问向量并打印出内容与赢家和输家向量的情况相同(即使它们是指向吃饼者向量的 object 元素的指针向量)
我做错了什么?
那是因为while循环永远不会结束,因为你已经在while循环条件中初始化了swapped = true
的值,当内部for循环结束并且swapped
的值变为真时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
class 中重载 < 并使用 std::sort
代替