C ++:将两个带有元组的向量合并为元素

时间:2017-01-31 12:18:28

标签: c++ vector merge

我有两个看起来像这样的向量: std::vector<std::tuple<unsigned int, unsigned int, float, Position, MemberOf>>

首先我用

对它们进行了排序
std::sort(vector.begin(), vector.end(), sort_func());

struct sort_func {
    inline bool operator() (std::tuple<unsigned int, float, Position> &element1, std::tuple<unsigned int, float, Position> &element2) {
        if (std::get<1>(element1) < std::get<1>(element2) || (std::get<1>(element1) == std::get<1>(element2) && tau(element1) < tau(element2)))
            return true;
        else
            return false;
    }

    unsigned int tau(std::tuple<unsigned int, float, Position> &element) {
        if (std::get<2>(element) == end)
            return 0;
        else if (std::get<2>(element) == in_plane)
            return 1;
        else if (std::get<2>(element) == start)
            return 2;
    }
};

现在我有两个已排序的向量,我想将它们合并在一起,我对它们进行了排序。 我见过,有std::merge()方法。但我不确定如何以这种复杂的方式使用它。

有人可以解释我在合并两个向量时如何使用sort_func吗?

最终合并列表应保持排序顺序。这就是目标。

感谢您的建议!

3 个答案:

答案 0 :(得分:1)

您可以在std::merge 中使用相同的比较功能对象,也可以参阅第二版

// v3 - output vector, v1, v2 -> sorted vector
std::merge(
           v1.begin(), v1.end(), 
           v2.begin(), v2.end(), 
           std::back_inserter(v3), 
           sort_func()
           );

答案 1 :(得分:1)

像这样:

std::vector<std::tuple<unsigned int, unsigned int, float, Position, MemberOf>> v1,v2,dst;
//fill v1,v2 however you did it
std::sort(v1.begin(), v1.end(), sort_func());
std::sort(v2.begin(), v2.end(), sort_func());
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dst),sort_func());

答案 2 :(得分:0)

如上所述:http://en.cppreference.com/w/cpp/algorithm/merge 比较两个实例的函数必须具有签名:

bool cmp(const Type1 &a, const Type2 &b);

所以你必须像那样实现它:

bool cmp(const std::tuple<unsigned int, float, Position, MemberOf> &element1, 
         const std::tuple<unsigned int, float, Position, MemberOf> &element2);

如果您愿意,可以调用原始功能。以这种方式实现之后,您应该能够使用:

std::vector<std::tuple<unsigned int, unsigned int, float, Position, MemberOf>> dest; // holds result
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), 
           std::back_inserter(dest), cmp);

似乎比较函数参数的类型不正确,因为它们缺少第一行中提到的MemberOf部分。