2017-04-16 3 views
2

私は例えば、ライブラリからstd::sortを使用してalgorithmSTDを使用して、特定の基準に2Dベクトルをソート::ソート

を所望の基準を使用して2Dベクトル(行列)をソートに関する1つのコーディングの問題が発生したのは、私が2Dを持っているとしましょうベクトル

1,8,3 
1,9,1 
1,4,2 
    ^

と私はだから私は行列を持ちたいソートした後(例えば、成長のための基準)第三列 ことによってそれをソートしたい:

1,9,1 
1,4,2 
1,8,3 
    ^

std::sortにソート基準を指定するには、第3の関数をstd::sortに送信する必要があることを知っています。それが1D vectorだった場合、それは問題ではないでしょう。私は2つのパラメータを持つstd::sortの中にラムダを作り、それらを比較してtrue/falseを返します。

これで、私が直面している問題を知ることができます。マトリックス内の特定の要素にアクセスするにはどうすればいいですか?第3の列要素をstd::sortと比較してください。

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

void printMatrix(std::vector<std::vector<int>> m) { 
    for(int i = 0; i < m.size(); i++) { 
     for(int j = 0; j < m[i].size(); j++) { 
      std::cout << m[i][j] << " "; 
     } 
     std::cout << std::endl; 
    } 
} 

int main() { 
    std::vector<std::vector<int>> m{ 
     {1,8,3}, 
     {1,9,1}, 
     {1,4,2} 
    }; 

    std::sort(m.begin(), m.end(), [](int a, int b) { // error 
       // ??? 
    }); 
    printMatrix(m); 

    return 0; 
} 

私はこの問題を解決するために他の外部ライブラリを使用しません。

ご協力いただきありがとうございます。 :)

答えて

3
std::sort(m.begin(), m.end(), [](int a, int b) { // error 
       // ??? 
    }); 
m.begin()

m.end()によって返されるイテレータのvalue_typestd::vector<int>あります。したがって、あなたのラムダは、両方のパラメータのためにタイプを取る必要があります。

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

注:私はあなたが誤って無効なインデックスでソートしようとしなければならないUBを防ぐために、むしろオペレータ[]よりも、ここでat()メンバ関数を使用しています。

Demo

+0

ありがとうございました!解決策は私が思ったよりも簡単です! :) – galaxyworks

+0

@ galaxyworks。どういたしまして。どんなときも!私はあなたの問題を解決することがうれしいです。 :-) – WhiZTiM

2

あなたがstd::vector<std::vector<int>>をソートしたい場合は、コンテナのアイテムは種類std::vector<int>、ないintです。したがって、あなたは、このような容器をソートする宣言

[](int a, int b) { ... } 

lambdaを使用することはできません。あなたはそれがlambdaをコールするたびにstd::vectorのコピーを作成することになりますので、最初のバージョンを使用すると、高価な宣言

[](std::vector<int> a, std::vector<int> b) { ... } 

または

[](std::vector<int> const& a, std::vector<int> const& b) { ... } 

lambdaを使用する必要があります。したがって、2番目のバージョンを使用することをお勧めします。

std::sort(m.begin(), m.end(), [](std::vector<int> const& a, 
           std::vector<int> const& b) { 
    return a.back() < b.back(); 
}); 
0

最も効率的な解決策ではないが、最も簡単な方法は、(行列別名)あなたの2Dベクトルは、各ベクトルを並べ替えてから、再度転置転置することです。

template<typename T> 
void sortColumns(vector<vector<T> > &v){ 
    vector<vector<T> > rv(v[0].size(), vector<T>(v.size())); 
    for(int i = 0; i < v.size(); i++){ 
     for(int j = 0; j < v[i].size(); j++){ 
      rv[j][i] = v[i][j]; 
     } 
    } 
    for(int i = 0; i < rv.size(); i++){ 
     sort(rv[i].begin(), rv[i].end()); 
     for(int j = 0; j < rv[i].size(); j++){ 
      v[j][i] = rv[i][j]; 
     } 
    } 
} 

を再び、これは最も効率的または列の行列をソートする最も近代的な方法ではありませんが、それは動作し、理解するのは簡単です:ここではあなたのためにこれを行いますテストし、作業機能です。

関連する問題