按字母顺序对字符串数组进行排序 C++

Posted

技术标签:

【中文标题】按字母顺序对字符串数组进行排序 C++【英文标题】:Sorting a String Array Alphabetically C++ 【发布时间】:2017-04-07 02:25:59 【问题描述】:

我正在尝试编写一个具有以下结构的程序:

struct aPlayer 
  string name;  // name of player
  int wins;     // number of wins player has
;

struct aCompetition 
  string  name;                 // name of the match
  int     numPlayers;           // number of players in the club
  aPlayer player[10];           // list of players in this club
;

从那里我想编写一个函数,按名称按字母顺序对玩家进行排序。函数声明如下:

    void sortByName(aCompetition & c)

注意:我想只使用 for 循环、while 循环和 if 语句来做到这一点。我认为比较这两个字符串的唯一方法是比较它们的 ASCII 值。我不知道该怎么做,所以任何输入都将不胜感激。谢谢!

【问题讨论】:

std::string 支持小于和大于比较。我会使用 std::sort,但如果你被限制在你可以使用的简单冒泡排序会很好,你可以很容易地找到该算法。 竞争真的应该是一个结构吗?考虑到它包含一个数组? 对我来说似乎很正常。一场比赛包含球员。 【参考方案1】:

排序由标准库提供,对带有operator< 的类型或其他类型(如果给定该比较器)提供。您可以构建一个 string::operator< 来执行词法比较。

#include <algorithm>
void sortByName(aCompetition& c) 
    sort(&c.player[0], &c.player[c.numPlayers],
            [](const aPlayer& a, const aPlayer& b) return a.name < b.name;);

如果您没有 C++11 lambda,那么您将使用仿函数。

struct compareAPlayerByName 
    boolean operator()(const aPlayer& a, const aPlayer& b) 
        return a.name < b.name;
    
;
void sortByName(aCompetition& c) 
    sort(&c.player[0], &c.player[c.numPlayers], compareAPlayerByName());

【讨论】:

【参考方案2】:

假设这是为了家庭作业(如果不是,自己做这件事会比仅仅看到答案对你有更多帮助)我只是给你一些建议来帮助你。

比较 ASCII 值:

aPlayer player1, player2;
player1.name = "bill";
player2.name = "john";
if (player1.name[0] < player2.name[0])

    // True, in this case, because b is less than j on the ascii table.

http://www.asciitable.com 用于 ascii 值。我建议在玩家名称上使用 tolower(),因为大写字母的值低于小写字母。

如果第一个数字相等,则转到第二个数字: (这样做的一种方法。)

aPlayer player1, player2;
player1.name = "alfred";
player2.name = "alvin";

// Find which name is shorter using .length() like player2.name.length()

// Loop through this next part for all aPlayers in aCompetition
for (int i = 0; i < shorterName.length(); i++)

    // Compare ascii values as I showed above.
    // If one is larger than the other, swap them.

【讨论】:

【参考方案3】:

一个简单的解决方案是将值存储为一个集合。这是在 C++ 中存储数据的一种相当标准的方式,并且具有自动按字母数字排序的优点。您将不得不围绕迭代器进行有效输出。

考虑这个执行:

std::set sortByNames(aCompetition & c, int numPlayers)

   std::set<std::string> sortedNames;

   for(int i = 0; i < numPlayers; i++)
   
       std::string name;
       //std::cout << i << ". ";
       name = player[i];

       sortedNames.insert(name);
   
   return sortedNames;

从这里您可以使用它来输出名称:

myNames = sortByNames(aCompetition, 10);
std::for_each(myNames.begin(), myNames.end(), &print);

您的头文件中还需要一个#include &lt;set&gt;

【讨论】:

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

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

C++ 按字母顺序排序字符串

根据字符串属性按字母顺序对对象数组进行排序

除数字外,如何按字母顺序对对象数组进行排序?

按特定顺序对名称数组进行排序

首先按频率对字符串中的字符进行排序,然后按字母顺序排序