我写了这个,还有它的废话。我现在整整都在编写代码,所以请礼貌。以下代码的编写完全是因为在我开始学习更高级的功能之前,我尝试熟悉语言本身。
我的问题很广泛。
在函数" sort_entries()"我根据从对象本身拉出的值,使用bubblesort来混合数组中的对象引用。
但是,我想知道是否有更简单的方法可以做到这一点?
事实上,我也想知道是否有更简单的方法来跟踪对象,而不是通过一系列指针来引用它们,因为坦率地说,我不喜欢绕过指针。
#include <iostream>
#include <stdio.h>
#include <new>
#include <cstring>
using namespace std;
using namespace std;
class Person {
int person_num;
int waffles_eaten;
public:
Person(int p_num, int waffles)
{
person_num = p_num;
waffles_eaten=waffles;
if(person_num == p_num && waffles_eaten == waffles)
{
printf("Entry #%i created. Waffles eaten = %i\n", person_num, waffles_eaten);
}
}
int get_num()
{
return person_num;
}
int get_eaten()
{
return waffles_eaten;
}
};
/* ****************************** */
int num_entries()
{
cout<<"How many entries to create?: ";
int count;
cin>>count;
return count;
}
void create_entry(Person **registry, int count)
{
int eaten;
for(int i =0; i<count; i++)
{
printf("Person #%i: Waffles eaten? \n", i);
cin>>eaten;
registry[i] = new Person(i, eaten);
}
}
void view_entries(Person **registry, int count)
{
for(int i=0; i<count; i++)
{
printf("Person #%i ate %i waffles\n", (registry[i])->get_num(), (registry[i])->get_eaten() );
}
}
void delete_entries(Person **registry, int count)
{
for(int i=0; i<count; i++)
{
delete [] registry[i];
}
}
void cpy_reg(Person **registry, Person **sorted_reg, int count)
{
for(int i=0; i<count; i++)
{
sorted_reg[i] = registry[i];
}
}
void display_data(Person **sorted_reg, count int)
{
}
void sort_entries(Person **registry, Person **sorted_reg, int count) // Need to figure why this actually works
{
cpy_reg(registry, sorted_reg, count); // copy the contents of registry[] to sorted_reg[]
cout<<"Sorted List"<<endl;
cout<<"------------"<<endl;
/* does magical sorting stuff */
int i, j;
Person *temp;
for(i=0; i<count; i++)
{
for(j=i+1; j<count; j++)cl
{
if( ((sorted_reg[i])->get_eaten() ) > ((sorted_reg[j])->get_eaten()) )
{
temp = *(sorted_reg + j);
*(sorted_reg+j) = *(sorted_reg+i);
*(sorted_reg+i) = temp;
}
}
}
}
void print_values(Person **reg, int count)
{
for(int i=0; i<count; i++)
{
printf("Entry #%i, --> %i waffles\n", i, (reg[i])->get_eaten() );
}
}
bool ask_to_sort()
{
string in;
bool out;
cout<<"Sort entries, and see data about them? (Y/N)"<<endl;
cin>>in;
if( in=="y" || in =="Y")
{
return true;
}else if(in=="n"||in=="N")
{
cout<<"Exiting"<<endl;
}
else {
cout<<"Enter Y/N"<<endl;
}
}
/* **************************** */
int main()
{
int count = num_entries();
Person *registry[count];
Person *sorted_reg[count];
create_entry(registry, count);
view_entries(registry, count);
if(ask_to_sort())
{
sort_entries( registry, sorted_reg, count);
}
print_values(sorted_reg, count);
delete_entries(registry, count);
return 0;
}
答案 0 :(得分:1)
正如其他人所提到的,在C ++中创建可变长度数组并不是有效的。
这些时间有std::vector
,您应该使用它。
所以不要这样:
Person *registry[count];
你应该这样做:
std::vector<Person> registry(count);
当你可以使用Person实例时,没有必要使用指针,它使代码更容易理解和维护。
因此,要在sort函数中交换两个项目,而不是:
temp = *(sorted_reg + j);
*(sorted_reg+j) = *(sorted_reg+i);
*(sorted_reg+i) = temp;
这样做:
swap(sorted_reg[i], sorted_reg[j])
只是交换价值。
毕竟,要对矢量进行排序,您可以依赖STL's sort function。您需要为operator<()
结构定义一个小于运算符(Person
)。