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

标签 c++ arrays sorting multidimensional-array bubble-sort

我有以下从外部.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/

相关文章:

c++ - 使用 glui 菜单栏

C++从字节数组实时播放音频

c++ - 如何调试和修复运行时错误,如 "Unhandled exception at 0x.... in ....exe: 0xC0000005: Access violation writing location 0x...."

c++ - 返回对数据成员的引用

c++ - 如果需要转换,我可以在将参数移动到另一个参数的同时读取参数吗?

c - 基于字符串比较的单词翻译程序不能正常工作

php - 按 ISO 日期对 PHP 数组进行排序

Python:如何将列表/数组/pd.Series中的零值设置为下一个非零值?

java - 这种类型存在吗?

python - 如何将工作字典排序程序转换为 Python 3.5