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

Sorting a String Array Alphabetically C++

本文关键字:排序 C++ 数组 字符串 顺序      更新时间:2023-10-16

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

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 值。我不确定该怎么做,所以任何输入将不胜感激。谢谢!

排序由标准库提供,对具有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());
}

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

比较 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.
}
<</div> div class="answers">

执行此操作的简单解决方案是将值存储为一组。这是一种在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 <set>