如何在C++中按特定列的值对 2d 字符串数组进行排序?
How do I sort a 2d string array by a specific column's values in C++?
我从外部.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]);
}
}
}
- 读取字符串文本输入以创建 2D 矢量
- 在将字符插入 2d 字符串时如何不显示空字符?
- 哪个更快:在 1d 向量中按字符串搜索还是在 2d 向量中按向量搜索?
- 字符串类型的 2d 数组(C++;)
- 从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在Mac os上打开Windows txt文件)
- 当我在将文件读取到C字符串的2D数组后尝试对任何内容进行定制时,C++分段错误
- 使用C++将1D数组转换为2D字符串数组
- 当字符串为"\0"时如何结束 2D 字符数组?
- 如何在 c++ 中初始化字符串的 2D 数组
- 如何在 c++ 中将 2D 数组转换为单个字符串
- 来自 2D 数组的字符串函数
- 如何创建带有字符串和浮点数的 2D 数组
- 在不使用递归的情况下求解所有 2D 字符串向量组合?(C++)
- 如何在 c++ 中将字符串拆分为字符串 2d 数组数组
- 如何在其中创建2D字符串向量并插入数据
- 我们如何在 c++ 中使用 std::sort 对 2D 字符串数组进行排序
- 如何在C++中将字符串数据存储在字符串 2D 数组中
- cout 用于仅打印最后一行的 2D 字符串矢量
- visual读取一个文件的十六进制数据,并将其存储到c++中的字符串2d数组中
- 创建整数 2d 数组(与字符串 2d 数组相比),而不提及维度