C++中如何根据整数数组排序规则同步排序对应字符串数组
你遇到的问题本质是两个数组的元素是强关联的,单独对其中一个数组排序时没有同步处理另一个数组的元素顺序,才会导致对应关系错乱。常见解决方法如下:
方案1:自定义结构体存储关联数据(最推荐)
将数值和对应的姓名绑定为同一个结构体的两个字段,直接对结构体数组排序,天然保留二者的对应关系,也便于后续扩展其他字段。
#include <iostream> #include <algorithm> #include <string> using namespace std; // 定义结构体绑定关联的数值和姓名字段 struct Person { int number; string name; }; int main() { Person people[] = { {5, "Jeremy"}, {2, "Samantha"} // 剩余元素按相同格式补充 }; int n = sizeof(people) / sizeof(people[0]); // 按number字段降序排序 sort(people, people + n, [](const Person& a, const Person& b) { return a.number > b.number; }); // 输出验证,对应关系完全保留 for(int i = 0; i < n; i++) { cout << people[i].number << " " << people[i].name << endl; } return 0; }
方案2:创建索引数组排序
如果不想修改原有数组的存储结构,可以额外创建一个索引数组,排序索引时按照对应位置的数值大小排序,排序完成后按索引顺序读取两个数组即可拿到正确的对应关系。
#include <iostream> #include <algorithm> #include <string> using namespace std; int main() { int Numbers[] = {5, 2}; string Names[] = {"Jeremy", "Samantha"}; int n = sizeof(Numbers) / sizeof(Numbers[0]); // 初始化索引数组 int indices[n]; for(int i = 0; i < n; i++) { indices[i] = i; } // 按Numbers对应值降序排序索引 sort(indices, indices + n, [&](int a, int b) { return Numbers[a] > Numbers[b]; }); // 按排序后的索引读取数据,对应关系正确 for(int i = 0; i < n; i++) { cout << Numbers[indices[i]] << " " << Names[indices[i]] << endl; } return 0; }
方案3:排序时同步交换两个数组元素(不推荐)
如果仅需要临时修改不想新增代码量,也可以自定义排序逻辑,每次交换数值数组元素的同时交换对应位置的姓名数组元素。但这种方法容易写错,且后续新增关联字段时需要同步修改排序逻辑,可维护性差。
内容的提问来源于stack exchange,提问作者Navier
相关产品推荐
相关产品推荐

