在 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<
将进行字典比较。所以"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++ 中对字符串数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章