在 C++ 中对字符串数组进行排序

Posted

技术标签:

【中文标题】在 C++ 中对字符串数组进行排序【英文标题】:Sorting an array of strings in C++ 【发布时间】:2015-04-08 01:16:36 【问题描述】:

我正在尝试完成以下任务:

按字母顺序列出学生,按姓氏排序。 不要更改名称的给定大小写。 不要更改输出文件格式。 (名姓) 只需按姓氏顺序打印记录,即

安妮·J

马丁·K

托比 L

这种排序必须是真正的字母顺序(不仅仅是“字典”排序)。

数据是从文件中读取的,并通过虚拟函数传递,具体取决于该学生注册的课程。这就是我所拥有的。

for (int i = 1; i < numStudents; i++)

   if (( list[i] -> getLastname() ) < ( list[i - 1] -> getLastname() ))
    
       Student *temp = list[i - 1];
       ist[i - 1] = list[i];
       list[i] = temp;
   

我已经为此工作了一段时间,我担心我做错了。任何提示/指针表示赞赏!

【问题讨论】:

您已经(基本上)实现了冒泡排序的内部循环。这还不足以对任何东西进行排序。为什么不使用std::sort?看起来您的程序很可能会访问您的 list 数组的边界之外,这也很危险。 对不起,我对编程有点陌生,但仍在尝试掌握字符串函数。我会看看!谢谢! 我不允许使用算法库:( 然后将您的循环扩展为适当的排序。查看***以获取任意数量的排序算法的示例。 还要注意operator&lt; 将进行字典比较。所以"amy" 将大于"Tom",因为'a'(ASCII 97)大于'T'(ASCII 84)。 【参考方案1】:

我假设你有一个这样的结构:

struct Student

    std::string m_LastName;
    std::string m_FirstName;
;

现在您需要确保可以处理两个人姓氏相同的情况。在这种情况下,您想查看名字。

bool NameCompare(const Student &name1, const Student &name2)

    if(name1.m_LastName == name2.m_LastName) 
        return name1.m_FirstName < name2.m_FirstName;
    

    return name1.m_LastName < name2.m_LastName;

然后在你的学生列表中调用 sort

std::list<Student> student_list;
// add some Student to the list
student_list.sort(NameCompare);

【讨论】:

【参考方案2】:

使用字符串比较函数代替您在此处使用的小于号:

if (( list[i] -> getLastname() ) < ( list[i - 1] -> getLastname() ))

还有一个类似的***问题(部分)

Is string::compare reliable to determine alphabetical order?

【讨论】:

字符串比较如string::compare,即:stringA.compare(stringB)

以上是关于在 C++ 中对字符串数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在Java中对二维字符串数组进行排序

在 C++ 中对结构数组进行排序

如何在iOS中对包含数字和名称的字符串数组进行排序

在 VTL 中对字符串数组进行排序

如何在 Java 中对对象数组进行排序?

在没有排序函数的数组中对字符串进行排序 - Ruby