使用用户定义的比较类对std :: pair的std :: vector进行排序

时间:2016-06-21 01:47:29

标签: c++ sorting templates c++11 vector

我有两个课程模板fooMyClassA<T>

通过这些,我构建了两个MyClassB<T>作为std::vectorstd::vector<MyClassA<double>> A

我的目标是首先按升序排序std::vector<MyClassB<double>> B(实际上我将进行范围/部分排序)。

然后使用该订单对A进行排序。

到目前为止我所做的是以下内容:

B

但是,我收到以下错误:

#include <iostream> #include <vector> #include <algorithm> #include <functional> #include <random> // my class definitions template<typename T> class MyClassA { public: T valA; }; template<typename T> class MyClassB { public: T valB; }; // my compare class template<typename T> using TIter = typename std::vector<T>::const_iterator; template <typename T> class MyCompare { public: bool operator()(std::pair<std::size_t, TIter<MyClassA<T>>> const& a, std::pair<std::size_t, TIter<MyClassA<T>>> const& b) { return *(a.second).valA < *(b.second).valA; } }; // sort from given order //... not yet implemented int main() { std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<> dis(0, 1); // first ClassA Object vector A std::vector<MyClassA<double>> A(5); for(auto& i:A) i.valA = dis(gen); // second ClassB Object vector B std::vector<MyClassB<double>> B(5); for(auto& i:B) i.valB = dis(gen); // sort vector A elements' references in ascending order std::size_t i = 0; std::vector<std::pair<std::size_t, TIter<MyClassA<double>>>> torder(A.size()); for(auto it = A.begin(); it != A.end(); ++it, ++i) torder[i] = std::make_pair(i, it); std::sort(torder.begin(), torder.end(), MyCompare<double>()); // getting error here // sort vectors A and B elements using the above sorted order // ... return 0; }

2 个答案:

答案 0 :(得分:4)

这是operator precedence的一个简单问题。成员选择点.的优先级高于取消引用运算符,因此例如*(a.second).valA被解析为*((a.second).valA)

只需更改为例如a.second->valA(或(*a.second).valA)。

答案 1 :(得分:1)

return *(a.second).valA < *(b.second).valA;

a.secondb.second似乎是迭代器,所以这应该只是:

return (a.second)->valA < (b.second)->valA;