Vector 可以从一个函数返回两个向量吗?

Vector 可以从一个函数返回两个向量吗?,vector,c++-cli,Vector,C++ Cli,我试图在cpp中对一个名为x的向量进行合并排序,该向量包含x坐标。当mergesort对x坐标进行排序时,它应该在一个名为y的向量中移动相应的元素,该向量包含y坐标。唯一的问题是,我不知道如何(或者是否可以)从merge函数返回两个结果向量。 或者,如果更容易实现,我可以使用较慢的排序方法。尝试以下方法: struct Point { int x; int y; operator <(const Point &rhs) {return x < rhs.x;} };

我试图在cpp中对一个名为x的向量进行合并排序,该向量包含x坐标。当mergesort对x坐标进行排序时,它应该在一个名为y的向量中移动相应的元素,该向量包含y坐标。唯一的问题是,我不知道如何(或者是否可以)从merge函数返回两个结果向量。
或者,如果更容易实现,我可以使用较慢的排序方法。

尝试以下方法:

struct Point {
  int x;
  int y;
  operator <(const Point &rhs) {return x < rhs.x;}
};

vector<Point> my_points.

mergesort(my_points);

不,不能从本例中的方法返回2个结果

vector<int>, vector<int> merge_sort();
vector,vector merge_sort();
你可以做的是通过引用一个函数传递2个向量,结果合并排序向量会影响这2个向量…例如

void merge_sort(vector<int>& x, vector<int>& y);
void merge\u排序(向量&x,向量&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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std::string_文本;
auto twoVectors()->std::tuple
{
常数std::向量a={1,2,3};
常数std::向量b={4,5,6};
返回{a,b};
}
auto main()->int
{
自动[a,b]=twoVectors();
auto const sum=std::accumulate(a.begin(),a.end(),std::accumulate(b.begin(),b.end(),0));

你可以有一个向量向量 =>向量点={a,b},{c,d};
现在您可以返回点。

等等,您有单独的x和y向量?为什么没有一个单独的坐标向量?@Preet Sangha::)是的。谢谢。问题是我获取坐标的方式,我的应用程序的最佳方式是将它们分开。有可能有一个包含两个向量的结构,按y坐标排序,然后有合并函数创建一个包含新向量的新结构,按x?排序,或让该函数更改现有结构。
#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;
}