我试图在 cpp 中对一个名为 x 的向量进行合并排序,该向量包含 x 坐标。当归并排序对 x 坐标进行排序时,它应该移动名为 y 的向量中的相应元素,其中包含 y 坐标。唯一的问题是我不知道如何(或者如果我可以)从合并函数返回两个结果向量。 或者,如果更容易实现,我可以使用较慢的排序方法。
不可以,您不能从本例中的方法返回 2 个结果。
vector<int>, vector<int> merge_sort();
您可以做的是通过引用函数传递 2 个向量,所得的合并排序向量会影响这 2 个向量...例如
void merge_sort(vector<int>& x, vector<int>& y);
最终,您可以执行@JoshD提到的操作,创建一个名为点的
struct
,并对点结构的向量进行合并排序。
尝试这样的事情:
struct Point {
int x;
int y;
operator <(const Point &rhs) {return x < rhs.x;}
};
vector<Point> my_points.
mergesort(my_points);
或者如果你想通过 y 坐标对 x 值相等的点进行排序:
另外,我想我应该补充一点,如果您确实需要,您可以随时返回
std::pair
。更好的选择通常是通过函数参数返回。
operator <(const Point &rhs) {return (x < rhs.x || x == rhs.x && y < rhs.y);}
是的,您可以返回一个元组,然后使用结构化绑定(C++17 起)。
这是一个完整的示例:
#include <cstdlib>
#include <iostream>
#include <numeric>
#include <tuple>
#include <vector>
using namespace std::string_literals;
auto twoVectors() -> std::tuple<std::vector<int>, std::vector<int>>
{
const std::vector<int> a = { 1, 2, 3 };
const std::vector<int> b = { 4, 5, 6 };
return { a, b };
}
auto main() -> int
{
auto [a, b] = twoVectors();
auto const sum = std::accumulate(a.begin(), a.end(), std::accumulate(b.begin(), b.end(), 0));
std::cout << "sum: "s << sum << std::endl;
return EXIT_SUCCESS;
}
你可以有一个向量的向量
=> 向量
返回向量很可能不是您想要的,因为它们是为此目的而复制的(这很慢)。例如,看看这个实现。