私は2つのクラステンプレートMyClassA<T>
とMyClassB<T>
を持っています。ユーザー定義の比較クラスを使用してstd :: pairのstd :: vectorを並べ替える
これらから、std::vector
をstd::vector<MyClassA<double>> A
とstd::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'
どのように並べ替えをしていますか、 'std :: sort'ですか? – ThomasMcLeod
@ThomasMcLeod:ベクトルAの並べ替えについて質問した場合は、上記の編集を行いました。はい、 'std :: sort'は' std :: vector' 'A'自体を実際にはソートしませんが、参照のみをソートします。 (良い質問) –