2017-01-07 20 views
0

私はベクトルのベクトルを作成しました。私が定義したパラメータに基づいてそれらを並べ替えたいと思います。ここでは、sort()関数は、vector<vector<int>>として定義された変数データセットをただちにvector<int>にします。誰かが間違っていることを説明できますか?なぜstd :: sortはstd :: vector <std :: vector <int>>をデフォルトでstd :: vectorにすると、間違った結果になるのですか?

さらに、上述の問題が分類された後でさえ、compare()関数は、ハードコードされたインデックスに対してのみ機能します。異なる指標に基づいてソートしたいのであれば、どうすればいいですか?私が言及できる方法はありますか?

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

//void check_function(std::vector <std::vector <int> > *dataset) 
//{ 
// std::cout<<(*dataset)[0].size()<<std::endl; 
//} 

bool compare(const std::vector <std::vector <int> > &a, const std::vector <std::vector <int> > &b) 
{ 
    return a[1] < b[1]; 
} 

/* This works, but this sorts based on the first parameter of the vector rather than what I mention. 
bool compare(const std::vector <int> &a, const std::vector <int> &b) 
{ 
    return a < b; 
} 
*/  
int main() 
{ 
    std::vector <int> data; 
    std::vector <int> data2; 
    std::vector <std::vector <int> > dataset; 

    data.push_back(5); 
    data.push_back(10); 
    dataset.push_back(data); 

    data2.push_back(5); 
    data2.push_back(20); 
    dataset.push_back(data2); 

// check_function(&dataset); 
    std::sort(dataset.begin(), dataset.end(), compare); 
    std::cout<< dataset[0][0]<<std::endl; 

    return 0; 
} 
+0

問題ははstd、ない比較::一種です。 std :: vector の2つのインスタンスを比較する比較を作成する必要があります。 – rcgldr

答えて

1

コンテナをソートするには、コンテナに含まれる要素のカップルを比較する関数が必要です。

したがって、std::vector<std::vector<int>>をソートするには、std::vector<int>のカップルを受け取る関数が必要です。

でも、compare()にはstd::vector<std::vector<int>>が2つあります。

これは間違っています。

オフトピック:あなたのcompare()関数(IMHO)は、少なくとも2つの要素が含まれているかどうかをチェックすることなく、両方のベクトルの第2要素へのアクセスが非常に危険です。

少なくとも、at()の代わりにoperator[]を使用してください。束縛された黙示を実行するだけで、捕捉可能な例外を得ることができます。

bool compare(const std::vector <int> & a, const std::vector <int> & b) 
{ 
    return a.at(1) < b.at(1); 
} 
のようなもの

--- EDIT ---

OPはどのように私は、実行時に決定されたインデックスに基づいて、それを並べ替えるん

を頼みますか?

そして、どこ?

compare()(例えば、std::sort()を呼び出す関数で)と決まっているとすると、ラムダ関数を使うことができます。

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

int main() 
{ 
    std::vector <std::vector <int> > dataset; 

    dataset.emplace_back(std::initializer_list<int>{200, 1}); 
    dataset.emplace_back(std::initializer_list<int>{5, 56}); 

    auto val = 1U; 

    std::sort(dataset.begin(), dataset.end(), 
      [val](const std::vector <int> &a, const std::vector <int> &b) 
       { return a.at(val) < b.at(val); }); 

    std::cout << dataset[0][0] << ", " << dataset[0][1] << std::endl; 

    return 0; 
} 
+0

std :: sortは、データセットの2つの要素への参照をcompare関数に渡します。これらの各要素は、std :: vector になります。 – rcgldr

+0

[こちらのコードをご確認ください](https://gist.github.com/lharikrishnan1993/fae76536a9a55487c2e6774ac73e955b)ありがとう。それは動作しますが、実行時に決定されるインデックスに基づいて、1としてハードコーディングするのではなく、どのようにソートするのですか? – Harikrishnan

+0

@rcgldr - 正確に;元のコードでは、 'compare()'は 'std :: vector > const&'を2つ受け取ります。それは間違いです。 – max66

関連する問題