按字母顺序对字符串数组进行排序 C++
Sorting a String Array Alphabetically C++
我正在尝试编写一个具有以下结构的程序:
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 值。我不确定该怎么做,所以任何输入都将不胜感激。谢谢!
一个简单的解决方案是将值存储为一个集合。这是在 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>
。
排序由标准库提供,对具有 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.
}
我正在尝试编写一个具有以下结构的程序:
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 值。我不确定该怎么做,所以任何输入都将不胜感激。谢谢!
一个简单的解决方案是将值存储为一个集合。这是在 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>
。
排序由标准库提供,对具有 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.
}