我有以下从外部.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);
更新:我需要/想要知道如何在原始字符串数组上专门执行此操作(没有 vector ,结构等)。
最佳答案
让我给你一个更好的方法,使用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)
方法来读取数据,将其放入成员 vector 中然后进行排序。无论如何,如果将来有人告诉您使用
std::sort
,那么搜索有关如何使用它的教程将不会有什么坏处。它提供了一些其他功能。像https://en.cppreference.com/w/cpp/algorithm/sort一样,对其进行描述,并确保阅读并理解其中的所有内容。在这种情况下,您可以编写幼稚的Bubblesort,但是在编程时,您希望自己做的尽可能少。 STL函数最有可能更有效(您的排序在O(N²)中,但是排序可以在O(NlogN)中进行),并一遍又一遍地进行测试(创建错误非常容易)。
另外,由于您在自定义气泡排序中自己定义了一个,因此STL带有built in
std::swap
。无论如何,请考虑将您将来的一些代码放在CodeReview上。
编辑:当您在问题中写了一些有关“未识别标识符排序”的内容时,如果要使用功能,则需要包括标题。如果是
std::sort
,则正确的斜率是#include <algorithm>
。
关于c++ - 如何在C++中按特定列的值对2D字符串数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64795963/