在黑马程序员C++课程中list容器部分有一个案例:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高;排序规则为按年龄升序,且当年龄相同时按照身高降序。
起初我先是创建Person类,然后我打算用一个赋值函数去赋值并打印数据:
class Person {
public:
Person(string name, int age, int height) {
this->m_name = name;
this->m_age = age;
this->m_height = height;
}
string m_name;
int m_age;
int m_height;
};
//赋值
void creatperson(list<Person>L){
string nameseed = "ABCDEFG";
for (int i = 0; i < 7; i++)
{
string name = "人物";
name += nameseed[i];
int age = 0;
age = rand() % 16 + 20;
int height = 0;
height = rand() % 41 + 150;
Person p(name, age, height);
L.push_back(p);
}
//show
cout << "排序前顺序:" << endl;
for (list<Person>::iterator lit = L.begin(); lit != L.end(); lit++) {
cout << "姓名:" << lit->m_name << "年龄:" << lit->m_age << "身高:" << lit->m_height << endl;
}
}
然后并用另一个函数按照排序规则进行排序:
//排序规则
bool my_compare(Person &p1,Person &p2) {
if (p1.m_age == p2.m_age)
{
return p1.m_height > p2.m_height;
}
else {
return p1.m_age < p2.m_age;
}
}
//排序并打印
void mysort(list<Person>L) {
L.sort(my_compare);
cout << "排序后顺序:" << endl;
for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {
cout << "姓名:" << it->m_name << "年龄:" << it->m_age << "身高:" << it->m_height << endl;
}
}
我发现打印的时候排序函数里面打印不到数据,然后我把排序函数整个内容搬到main()里,还是无法正常输出,但是在我把这些全部合并成一个函数后,就能够正常输出打印,所以我推测赋值函数中的L和排序函数中的L之间并没有关联到一起。
所以我想请教一下大家,如何在不整合的情况下在排序函数里调用赋值函数里L的数据?
在C++中,函数参数传递默认是按值传递的,这意味着函数接收到的是实参的副本。在你的代码中,creatperson()和mysort()函数中的L参数是通过按值传递的方式接收的,因此对它们进行的修改不会影响到原来的list容器。
为了解决这个问题,你可以通过以下两种方式传递参数:
在你调用这些函数时,需要使用容器对象的地址或指针来传递参数。示例代码如下:
使用引用或指针传递参数可以确保在函数内部对容器的修改能够影响到原始对象,从而在排序函数中正确访问和操作容器中的数据。
根据问题描述,你遇到了在排序函数中无法访问赋值函数中创建的数据的问题。这个问题可能是由于作用域的问题导致的。
要解决这个问题,你可以将赋值函数创建的数据作为参数传递给排序函数。这样,在排序函数中就可以访问和操作赋值函数中创建的数据了。
以下是示范解决方案的代码:
#include <iostream>
#include <list>
using namespace std;
class Person {
public:
string name;
int age;
int height;
};
// 赋值函数
void assignData(list<Person>& data) {
// 创建Person对象并赋值
Person person1;
person1.name = "张三";
person1.age = 20;
person1.height = 180;
Person person2;
person2.name = "李四";
person2.age = 22;
person2.height = 170;
// 将Person对象加入到列表中
data.push_back(person1);
data.push_back(person2);
}
// 排序函数
void sortData(list<Person>& data) {
// 将列表内的Person对象按照规则排序
data.sort([](const Person& p1, const Person& p2) {
if (p1.age == p2.age) {
return p1.height > p2.height; // 按照身高降序排序
}
return p1.age < p2.age; // 按照年龄升序排序
});
// 打印排序后的数据
for (const auto& person : data) {
cout << "姓名:" << person.name << ",年龄:" << person.age << ",身高:" << person.height << endl;
}
}
int main() {
list<Person> dataList;
// 调用赋值函数来创建数据
assignData(dataList);
// 调用排序函数来对数据进行排序并打印
sortData(dataList);
return 0;
}
在上面的代码中,赋值函数assignData
创建了两个Person对象并将它们加入到列表dataList
中。然后,将dataList
作为参数传递给排序函数sortData
,在排序函数中可以访问并操作dataList
中的数据。最后,在主函数中调用赋值函数和排序函数来完成整个流程。
希望这个解决方案能帮助到你解决问题。如果你有任何其他问题,请随时提问。