基于另一向量排序C++向量时结果不符合预期,请求排查原因
问题:基于一个向量对另一个向量排序的C++代码故障排查
我尝试用C++的sort函数,基于向量v2的元素顺序来对向量v1进行排序。举个例子:如果v1 = (1, 2, 3, 4, 5)、v2 = (-1.1, 1.5, 0.2, 4, 3),调用relative_sort(v1,v2)之后,v1应该变成(1, 3, 2, 5, 4),但我的代码没法正常工作,找不到问题出在哪。我写的代码片段如下:
#include <vector> #include <iostream> #include <fstream> #include <algorithm> using namespace std; void print_vector (vector<double> & v) { for (in...
问题分析与解决方案
你遇到的核心问题是:直接单独对v1调用sort没法关联v2的排序规则——sort默认只处理单个容器的元素,没法直接“参考”另一个容器的顺序。要实现需求,你需要把v1和v2的对应元素绑定在一起,先对绑定后的集合按v2的值排序,再提取排序后的v1元素覆盖原容器。
以下是修复后的完整代码:
#include <vector> #include <iostream> #include <algorithm> #include <cerrno> using namespace std; // 打印向量的辅助函数(适配int类型的v1) void print_vector(const vector<int>& v) { for (int num : v) { cout << num << " "; } cout << endl; } void relative_sort(vector<int>& v1, const vector<double>& v2) { // 先检查两个向量长度是否一致,避免越界 if (v1.size() != v2.size()) { cerr << "错误:v1和v2必须拥有相同的长度!" << endl; return; } // 创建配对容器,把v2的元素作为排序依据,绑定对应的v1元素 vector<pair<double, int>> value_pairs; for (size_t i = 0; i < v1.size(); ++i) { value_pairs.emplace_back(v2[i], v1[i]); } // 按v2的元素值升序排序(pair默认按第一个元素排序) sort(value_pairs.begin(), value_pairs.end()); // 把排序后的v1元素提取出来,覆盖原v1 for (size_t i = 0; i < v1.size(); ++i) { v1[i] = value_pairs[i].second; } } int main() { vector<int> v1 = {1, 2, 3, 4, 5}; vector<double> v2 = {-1.1, 1.5, 0.2, 4, 3}; cout << "排序前的v1: "; print_vector(v1); relative_sort(v1, v2); cout << "排序后的v1: "; print_vector(v1); return 0; }
代码关键点说明
- 配对元素:用
pair<double, int>将v2的元素作为排序键、v1的对应元素作为值,这样排序时会自动以v2的规则调整顺序。 - 排序逻辑:
sort默认对pair按第一个元素升序排列,正好符合你需要的“基于v2排序v1”的需求。如果需要降序,只需添加自定义比较器:sort(value_pairs.begin(), value_pairs.end(), [](const auto& a, const auto& b) { return a.first > b.first; }); - 边界检查:添加了向量长度一致性检查,避免因容器长度不同导致的越界错误。
运行这段代码后,输出会完全符合你的预期:
排序前的v1: 1 2 3 4 5
排序后的v1: 1 3 2 5 4
内容的提问来源于stack exchange,提问作者rasul
相关产品推荐
相关产品推荐

