如何在C++中按特定列的值对 2d 字符串数组进行排序?

How do I sort a 2d string array by a specific column's values in C++?

本文关键字:字符串 2d 数组 排序 C++      更新时间:2024-09-26

我从外部.txt文件中获得/创建了以下2d数组。

string accountsArr[5][7] = {
"bham@gnet.com", "Blake", "Ham", "squid62", "1987", "U", "Teacher",
"jdark@att.net", "Jim", "Dark", "gymrat32", "1985", "A", "Master",
"hgreen@lakes.net", "Hannah", "Green", "flower22", "2007", "U", "Apprentice",
"tsmith@dna.com", "Tom", "Smith", "tuna20", "2000", "U", "Teacher",
"jarrow@pnet.com", "James", "Arrow", "ahoy10", "2005", "U", "Apprentice"
};

我需要根据";姓氏";列(每行的列索引2(,所以我基本上以结束

string accountsArr[5][7] = {
"jarrow@pnet.com", "James", "Arrow", "ahoy10", "2005", "U", "Apprentice",
"jdark@att.net", "Jim", "Dark", "gymrat32", "1985", "A", "Master",
"hgreen@lakes.net", "Hannah", "Green", "flower22", "2007", "U", "Apprentice",
"bham@gnet.com", "Blake", "Ham", "squid62", "1987", "U", "Teacher",
"tsmith@dna.com", "Tom", "Smith", "tuna20", "2000", "U", "Teacher"
};

我该如何通过编程实现这一点?使用std::sort不起作用。我一直得到use of undeclared identifier sort

int n = sizeof(accountsArr[0]) / sizeof(accountsArr[0][0]);
std::sort(accountsArr, accountsArr + n);

更新:我需要/想知道如何在基元字符串数组(没有向量、结构等(上执行此操作。

让我给您一个更好的方法来处理您的问题,使用std::sort

首先,为您的数据创建一个适当的结构。我会稍微简化一下你的条目。我们也已经为此实现了operator<,因为我们稍后需要它。

struct Person
{
string first_name;
string last_name;
string email;
Person(const string& first_name, const string& last_name, const string& email) :
first_name(first_name), last_name(last_name), email(email) {}
bool operator<(const Person& other) const { return last_name < other.last_name; }
};

C++是一种面向对象的语言,如果你有任何一种规则结构化的数据,它至少应该是一种结构。由于我们不需要封装,也没有办法使对象无效,我们可以将其保留为一个结构,否则我们将选择一个类。

原始数组通常不是存储数据的好方法。使用它的唯一好理由是当事情必须针对速度进行超优化时。因此,我们现在将您的原始数组转换为一个合适的容器:

vector<Person> persons;
persons.reserve(rows); // <-- reserve allows for the memory to be properly pre-allocated
for(size_t i=0; i<rows; i++)
{
persons.push_back(Person(accountsArr[i][1], accountsArr[i][2], accountsArr[i][0]));
}

既然我们在定义operator<的结构上有了一个合适的容器,那么我们所要做的就是调用std::sort:

std::sort(persons.begin(), persons.end());

完成。

我们还可以考虑创建一个类Persons来处理所有这些,使用一个方法read_file(const string& file)来读取数据,将其放入成员向量中,然后对其进行排序

无论如何,对于未来,如果人们告诉你使用std::sort,那么搜索关于如何使用它的教程也无妨。它还提供了一些其他功能。请对其进行描述,如https://en.cppreference.com/w/cpp/algorithm/sort,并确保阅读和理解其中的所有内容。
在这种情况下,您可以编写一个天真的冒泡程序,但当您编程时,您希望自己尽可能少做。STL函数很可能更有效(排序是在O(N²(中进行的,但排序可以在O(NlogN(中进行(,并经过反复测试(创建错误很容易发生(。

此外,STL有一个内置的std::swap,因为您自己在自定义气泡排序中定义了一个

无论如何,考虑将您未来的一些代码放在CodeReview上。

编辑:当你写了一些关于"未识别标识符排序";在您的问题中,如果您想要功能,则需要包含标头。在std::sort的情况下,右侧包含#include <algorithm>

所以我通过做一个";气泡排序";。以下是我实现它的方法。希望这能帮助其他难以找到按特定列排序的2d数组示例的人:

int rows = 5;
int col = 7;
string accountsArr[rows][col] = {
"bham@gnet.com", "Blake", "Ham", "squid62", "1987", "U", "Teacher",
"jdark@att.net", "Jim", "Dark", "gymrat32", "1985", "A", "Master",
"hgreen@lakes.net", "Hannah", "Green", "flower22", "2007", "U", "Apprentice",
"tsmith@dna.com", "Tom", "Smith", "tuna20", "2000", "U", "Teacher",
"jarrow@pnet.com", "James", "Arrow", "ahoy10", "2005", "U", "Apprentice"
};
//do a bubble sort
for(int maxElement = rows - 1; maxElement > 0; maxElement--){
for(int i = 0; i < maxElement; i++){
//if current row "last name" column is > the next row "last name" column, swap them
if(theAccounts[i][2] > theAccounts[i + 1][2]){
std::swap(theAccounts[i], theAccounts[i + 1]);
}
}
}