我有两个看起来像这样的向量:
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
吗?
最终合并列表应保持排序顺序。这就是目标。
感谢您的建议!
答案 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部分。