C++ 协助排序指向c+中字符串数组的指针数组+;

C++ 协助排序指向c+中字符串数组的指针数组+;,c++,arrays,string,sorting,pointers,C++,Arrays,String,Sorting,Pointers,我一直试图找到一种方法,对指针数组(指向字符串)进行排序,然后显示未排序列表和已排序列表,但无论我尝试什么,第二个打印列表始终与原始未排序列表相同。如果您能提供任何帮助,我们将不胜感激(如果我的代码乱七八糟,我很抱歉,我是一名新生) 这是我的主要任务(lab5.cpp) #包括 #包括 #包括“student.h” #包括 使用名称空间std; int main(int argc,char*argv[]) { 学生斯图; stu.list(); 系统(“暂停”); 返回退出成功; } 这是我的

我一直试图找到一种方法,对指针数组(指向字符串)进行排序,然后显示未排序列表和已排序列表,但无论我尝试什么,第二个打印列表始终与原始未排序列表相同。如果您能提供任何帮助,我们将不胜感激(如果我的代码乱七八糟,我很抱歉,我是一名新生)

这是我的主要任务(lab5.cpp)

#包括
#包括
#包括“student.h”
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
学生斯图;
stu.list();
系统(“暂停”);
返回退出成功;
}
这是我的页眉(student.h)

#包括
班级学生
{
公众:
学生();
void setnameage();
int getage(int);
std::字符串getname(int);
无效排序();
作废清单();
私人:
std::字符串名称[50];
std::字符串名称[50];
国际年龄[50];
std::string*Pname;
int*页;
整数金额;
};
这是我的对象(student.cpp)

#包括
#包括
#包括“student.h”
#包括
使用名称空间std;
//建造师
学生::学生()
{
int i=0;
金额=0;
Pname=名称;
Page=年龄;
而(i!=50)
{
年龄[i]=0;
名称[i]=“A”;
i=i+1;
}
std::cout>数量;
}
//设定时间和年龄
void student::setnameage()
{
int i=0;
而(i!=金额)
{
std::cout nameL[i];
性病::cout>age[i];
i++;
}
}
//变老
int student::getage(int i)
{
返回年龄[i];
}
//得名
std::string student::getname(inti)
{
返回名称[i];
}
//对各种指针进行排序
void student::sort()
{
std::字符串模板;
int tempN;
i=0

对于(int i=1;i首先让我说您的程序有很多设计问题,但要回答您的实际问题:

问题是你没有50个指针的数组,你只有一个指向数组开头的指针。在你的排序函数中,你有一行来交换字符串指针:

Pname[i].swap(Pname[j]);
但这并不交换指针,而是交换原始字符串。因此,不是以原始字符串数组和指向这些字符串的重新排序数组结束,而是以重新排序的字符串数组结束

您应该将
std::string*pName;
更改为
std::string*pName[50];
。在程序开始时,初始化数组以指向字符串

for (int i = 0; i < 50; i++) pName[i] = &name[i];
最后,由于
pName[i]
现在是一个指针,因此无论何时您真正想要访问字符串,都必须取消对指针的引用

if(Pname[i].compare(Pname[j]) > 0)
变成

if(Pname[i]->compare(*Pname[j]) > 0)
同样的问题也存在于你的年龄排序方法中


更好的程序设计是使用
std::list
存储姓名和年龄。然后,您可以使用内置的排序功能对列表进行排序(如果需要保留原始列表,还可以轻松复制).

请更正表格和常规格式。这将使阅读代码更加容易,也许您会得到更多帮助。您试图按
Pname
排序,但您从未指定
Pname
有效值。
std::list
如何比
vector
更好(或者至少是
std::array,如果大小不变)?或者甚至是
std::map`?@DanM。不知道,如果你5年前问我,我可能已经知道我为什么这么说了……是的。只注意到我发表评论后的日期。所以可能推荐我这个问题,因为仍然没有公认的答案=)哦。。。
for (int i = 0; i < 50; i++) pName[i] = &name[i];
std::swap(pName[i], pName[j]);
if(Pname[i].compare(Pname[j]) > 0)
if(Pname[i]->compare(*Pname[j]) > 0)