C++ 排序类字符串数组
Posted
技术标签:
【中文标题】C++ 排序类字符串数组【英文标题】:C++ Sorting Class String Array 【发布时间】:2016-06-02 01:21:16 【问题描述】:过去几天我一直致力于这个项目。我的问题是,当涉及到排序功能时,它就崩溃了。我觉得我缺少“排序”功能的参数。也许更老练的眼睛可以看到我的错误。目标是让用户输入一个字符串,将其应用于class person
的数组,排序,然后打印到控制台。输入部分完美运行,但排序功能甚至无法编译,我没有包含该部分,但如果需要,我也会发布。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
//class declaration
class Person
public:
string lastName;
string firstName;
;
//variables
int entry; // defined in other function
string choice; //defined in other function
//arrays
Person nameArray[10];
//function declarations
void sortView()
sort(nameArray[0].lastName.begin(), nameArray[0].lastName.end() + entry);
for (int i = 0; i < entry; i++)
cout << nameArray[i].lastName;
cout << ", ";
cout << nameArray[i].firstName;
cout << endl;
;
【问题讨论】:
查看sort 的文档根本不是这样 问题是排序的所有文档都提到了使用 int 数据类型,对于这个赋值,输入必须是字符串。我很清楚它们基本级别的字符串是 int 值,但我不明白我缺少什么。 是吗?我链接到的文档显示了如何使用正是您需要的自定义比较功能。示例使用 int 而不是字符串这一事实无关紧要。 没有理由在你的函数中使用unsigned int
,因为你现在有它,为了简单起见,只需使用int
。我提供了删除这些内容的编辑。
【参考方案1】:
std::sort
() 接受两个必需参数:开始迭代器值和结束迭代器值,用于定义要排序的序列。
你传递给std::sort
() 的东西看起来不像一对迭代器。它甚至没有编译。
NameArray.lastName
不是有效的 C++。 NameArray
是一个数组。 .
运算符用于结构或类,而不是数组。
要对这个十元素数组进行排序,您通常会使用:
sort(NameArray, NameArray+10);
利用在表达式中使用数组名称为您提供指向数组第一个元素的指针这一事实,在这种情况下,这些指针在逻辑上等同于迭代器。
但是,这也不起作用,因为它没有定义如何比较 NameArray
的元素。 NameArray
包含 person
类的实例,只有当您可以使用 <
运算符比较不同的值时,您才能对某些内容进行有意义的排序,当然,将较小的值排在较大的值之前。
为了对该数组进行排序,您还需要:
1) 将第三个可选参数传递给 std::sort
(),这是一个比较 person
类的两个实例的 lambda,或者
2) 在person
类中实现operator<
成员方法。
【讨论】:
【参考方案2】:sort(std::begin(NameArray), std::end(NameArray), [](const person& p1, const person& p2)
// write your sort logic, for example
return p1.lastName < p2.lastName;
);
对于std::sort
,需要提供两个迭代器和一个比较函数
【讨论】:
【参考方案3】:好吧,数组不是这样工作的。
NameArray
将给出指向数组第一个元素的指针,NameArray + 10
将给出指向第十一个元素的指针,但 NameArray.lastName
不存在。 NameArray
是一个数组,而不是一个人。数组的姓氏是什么?
您要做的是将sort
应用于NameArray
,并根据其姓氏对其进行排序。应用于NameArray
,所以应该是:
sort(NameArray, NameArray + entry)
.
现在您将遇到另一个编译错误。 sorting function 需要一种比较两个 person
的方法(你的类名应该以大写开头!)。
有两种方法可以做到这一点。您可以根据lastName
认为person
始终不如另一个@,在这种情况下,您将重载person
的<
运算符。
或者您将指定一种特殊的方式来将元素与您的排序函数进行比较:
sort(NameArray, NameArray + entry, [](const person &p1, const person &p2)
return p1.lastName < p2.lastName;
);
做some reading了解更多,你也可以查一下lambda函数。
PS:保持以大写开头的名称是您的类,这样命名变量会令人困惑。
您可能还想查找 std::vector
或 std::valarray
作为使用固定大小数组的替代方法。
【讨论】:
以上是关于C++ 排序类字符串数组的主要内容,如果未能解决你的问题,请参考以下文章