我有两个课程模板foo
和MyClassA<T>
。
通过这些,我构建了两个MyClassB<T>
作为std::vector
和std::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;
}
答案 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.second
和b.second
似乎是迭代器,所以这应该只是:
return (a.second)->valA < (b.second)->valA;