2016-06-21 8 views
0

私は2つのクラステンプレートMyClassA<T>MyClassB<T>を持っています。ユーザー定義の比較クラスを使用してstd :: pairのstd :: vectorを並べ替える

これらから、std::vectorstd::vector<MyClassA<double>> Astd::vector<MyClassB<double>> Bの2つに構成しました。

私の目標は、最初に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; 
} 

しかし、私は次のエラーを取得しています:

error: 'const class __gnu_cxx::__normal_iterator<const MyClassA<double>*, std::vector<MyClassA<double> > >' has no member named 'valA'

+0

どのように並べ替えをしていますか、 'std :: sort'ですか? – ThomasMcLeod

+0

@ThomasMcLeod:ベクトルAの並べ替えについて質問した場合は、上記の編集を行いました。はい、 'std :: sort'は' std :: vector' 'A'自体を実際にはソートしませんが、参照のみをソートします。 (良い質問) –

答えて

4

operator precedenceの問題の簡単なケースです。メンバー選択ドット.は、逆参照演算子よりも高い優先順位を持ちます。 *(a.second).valAは、*((a.second).valA)として解析されます。

a.second->valA(または(*a.second).valA)。

+0

ありがとうございました。地獄私はそんなに時間を無駄にした! –

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

a.secondb.secondはイテレータのように見えます、これは単純に次のようになります:

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

ありがとうございました。地獄私はそんなに時間を無駄にした! –

関連する問題