繁体   English   中英

C++:合并两个以元组为元素的向量

[英]C++: Merge two vectors with tuples as element

我有两个看起来像这样的std::vector<std::tuple<unsigned int, unsigned int, float, Position, MemberOf>>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吗?

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

谢谢你的建议!

您也可以在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()
           );

像这样:

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());

如此处所述: 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 部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM