如何对vector中存储的punto坐标对象按x或y轴排序?
嘿,我来帮你搞定这个排序问题!你遇到的报错本质是C++的sort函数默认不知道怎么比较你的punto类对象——它需要明确的规则来判断两个坐标谁在前谁在后。之前的错误大概率是你写比较逻辑时,误把参数当成了int类型的x/y,而不是punto对象本身,所以编译器才会抛出异常。下面给你几种实用的解决方法,轻松实现按x轴或y轴排序:
方法1:为
punto类重载比较运算符 如果你的场景里默认需要按某个轴排序(比如默认按x轴),直接在类里重载<运算符是最省心的方式,这样sort可以直接使用默认逻辑:
#include <iostream> #include <vector> #include <algorithm> class punto { public: int x; int y; // 构造函数初始化坐标 punto(int x_, int y_) : x(x_), y(y_) {} // 重载<运算符,定义按x轴升序的比较规则 bool operator<(const punto& other) const { return this->x < other.x; } }; int main() { int n; std::cout << "输入坐标数量n: "; std::cin >> n; std::vector<punto> puntos; for (int i = 0; i < n; ++i) { int x, y; std::cout << "输入第" << i+1 << "组坐标(x y): "; std::cin >> x >> y; puntos.emplace_back(x, y); } // 直接调用sort,默认按x轴升序排序 std::sort(puntos.begin(), puntos.end()); std::cout << "\n按x轴升序排序结果:\n"; for (const auto& p : puntos) { std::cout << "(" << p.x << ", " << p.y << ")\n"; } return 0; }
方法2:自定义比较函数(灵活切换排序轴)
如果需要在不同场景下切换按x或y排序,单独写比较函数会更灵活,想换规则直接传不同的函数就行:
#include <iostream> #include <vector> #include <algorithm> class punto { public: int x; int y; punto(int x_, int y_) : x(x_), y(y_) {} }; // 按x轴升序的比较函数 bool compareByX(const punto& a, const punto& b) { return a.x < b.x; } // 按y轴升序的比较函数 bool compareByY(const punto& a, const punto& b) { return a.y < b.y; } int main() { int n; std::cout << "输入坐标数量n: "; std::cin >> n; std::vector<punto> puntos; for (int i = 0; i < n; ++i) { int x, y; std::cout << "输入第" << i+1 << "组坐标(x y): "; std::cin >> x >> y; puntos.emplace_back(x, y); } // 按x轴排序 std::sort(puntos.begin(), puntos.end(), compareByX); std::cout << "\n按x轴升序排序结果:\n"; for (const auto& p : puntos) { std::cout << "(" << p.x << ", " << p.y << ")\n"; } // 按y轴排序 std::sort(puntos.begin(), puntos.end(), compareByY); std::cout << "\n按y轴升序排序结果:\n"; for (const auto& p : puntos) { std::cout << "(" << p.x << ", " << p.y << ")\n"; } return 0; }
方法3:使用Lambda表达式(简洁写法)
如果不想单独写函数,用Lambda表达式可以直接在sort调用里定义比较逻辑,代码更紧凑,还能随时调整升序/降序:
// 输入逻辑省略... // 按x轴升序排序 std::sort(puntos.begin(), puntos.end(), [](const punto& a, const punto& b) { return a.x < b.x; }); // 按y轴降序排序(把<改成>即可实现降序) std::sort(puntos.begin(), puntos.end(), [](const punto& a, const punto& b) { return a.y > b.y; });
关键要记住:sort的比较逻辑参数必须接收两个punto类型的对象(或引用),然后通过对象访问x/y成员来做比较,不能直接把x/y当成参数传给比较函数,这就是你之前报错的核心原因。
内容的提问来源于stack exchange,提问作者Erick.1993
相关产品推荐
相关产品推荐

