2017-01-28 3 views
0

私はDoubleVectorのようなものを実装したいと思います。 このクラスでは、v1_をソートするソートメソッドを実装したいと思います。また、v1_の変更に応じて、v2_の順序も変更されます。 コード以下の通りです:最初のベクトルの変化に応じてソートダブルベクトルはどのようにソートされますか?

#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 
class DoubleVector 
{ 
    vector<int> v1_; 
    vector<char> v2_; 
public: 
    void sort() 
    { 
     //sort v1_ and also change order in v2_ according to changes in v1_ 
     std::sort(v1_.begin(), v1_.end() /*, lambda ?*/); 
    } 
    void add(int value_v1, char value_v2) 
    { 
     v1_.push_back(value_v1); 
     v2_.push_back(value_v2); 
    } 
    void print() 
    { 
     const auto size = v1_.size(); 
     for (size_t i=0;i<size;++i) 
     { 
      cout << v1_[i] << " " << v2_[i] << endl; 
     } 
    } 
}; 
int main() 
{ 
    DoubleVector dv; 
    dv.add(6, 'g'); 
    dv.add(2, 'r'); 
    dv.add(3, 'y'); 
    dv.add(4, 'a'); 
    cout << "Before sort:" << endl; 
    dv.print(); 
    dv.sort(); 
    cout << "After sort:" << endl; 
    dv.print();//the values in v2_ are in the same order they don't change order according to v1_ changes 
    return 0; 
} 

あなたがDoubleVectorを見ることができるようにする前にソート含まれています

6 g 
2 r 
3 y 
4 a 

そして、ソート後に含まれています

2 g 
3 r 
4 y 
6 a 

私が取得したいと思います:

2 r 
3 y 
4 a 
6 g 

したがって、最初のベクトルv1_はソートされていますが、2番目のベクトルは同じ順番になっており、2番目のv2_ベクトルの要素の順序をv1_の変更に従って変更したいと考えています。 私はそれを書くことができますが、おそらくstd :: sort関数の第3引数としてラムダを使用して、高速かつクリーンな方法でそれをやりたいのですか? DoubleVectorクラスのベクトルv1_およびv2_はそのままでなければなりません。

ありがとうございました。

+0

'ソートv1_とv2_でv1_順序の変化に応じても、あなたがソートにしたい、彼らは私が混乱していますare.'のようなベクターは、クラスDoubleVectorでv1_とv2_が滞在しなければならない' change.'ますv1_とv2_を修正するか、新しいDoubleVectorを返すようにしますか? – Enfyve

答えて

3

代わりにベクトルをstd::pair<int,char>にしてください。ペアのoperator <firstを比較して、必要な正確な効果を生成しますstd::vector<std::pair<int,char>>を並べ替え、secondにネクタイを決定しているので:

vector<pair<int,char>> v; 
v.push_back(make_pair(6, 'g')); 
v.push_back(make_pair(2, 'r')); 
v.push_back(make_pair(3, 'y')); 
v.push_back(make_pair(4, 'a')); 
sort(v.begin(), v.end()); 
for (int i = 0 ; i != v.size() ; i++) { 
    cout << v[i].first << " " << v[i].second << endl; 
} 

Demo.

+0

ありがとうございます。しかし、DoubleVectorクラスのベクトルv1_とv2_は、そのままにしておかなければなりません。 – user2856064

+0

@ user2856064それらをペアのベクトルにコピーし、ソートしてコピーバックします。 – dasblinkenlight

+0

それは多くの費用がかかります。多分もっと良い解決策があるかもしれません。 – user2856064

2

あなたはこのような何かを行うことができます: -

vector< pair<int,char> >v; 
//do what you want 
sort(v.begin(),v.end()) 

デフォルトでソート機能は最初の値に基づいてソートを行いますが、ソート作業の基準に応じていつでも定義することができます

+0

ありがとうございます。しかし、DoubleVectorクラスのベクトルv1_とv2_はそのままでなければなりません。 – user2856064

+0

http://stackoverflow.com/questions/1723066/c-stl-custom-sorting-one-vector-based-on-contents-of-another –

0

次のことを試してみてください。

どのように動作するかは、intベクトル値のみに基づいて位置キーのペアをソートし、この順序を使用して値を抽出することです。

#include <iostream> 
#include <algorithm> 
#include <vector> 

class dv 
{ 
    std::vector<int> _v1; 
    std::vector<char> _v2; 
    std::vector<std::pair<int, int> > _order; 

public: 
    inline bool operator() (const std::pair<int, int>& v1_index_1, 
          const std::pair<int, int>& v1_index_2) const { 
    return _v1[v1_index_1.first] < _v1[v1_index_2.first]; 
    } 

    void sort() { 
    std::sort(_order.begin(), _order.end(), *this); 
    } 

    void add(int value_v1, char value_v2) { 
    _order.push_back(std::pair<int, int>(_v1.size(), _v2.size())); 
    _v1.push_back(value_v1); 
    _v2.push_back(value_v2); 
    } 

    void print() { 
    const auto size(_v1.size()); 
    for (size_t i=0; i<size; ++i) {  
     std::cout << _v1[_order[i].first] 
       << " " 
       << _v2[_order[i].second] 
       << std::endl; 
    } 
    } 
}; 

int main() { 

    dv dv; 

    dv.add(6, 'g'); 
    dv.add(2, 'r'); 
    dv.add(3, 'y'); 
    dv.add(4, 'a'); 

    std::cout << "before sort: " << std::endl; 

    dv.print(); 

    std::cout << "sorting: " << std::endl; 

    dv.sort(); 

    std::cout << "after sort: " << std::endl; 

    dv.print(); 

    return 0; 
}