C++でのベクトルのソート
イントロダクション
このチュートリアルでは、C++でベクトルをソートすることに焦点を当てます。
ソートは、どのプログラミング言語でも広く実行される操作の一つです。同様に、C++でも、様々なアルゴリズムを使ってさまざまなデータ構造をソートすることができます。
ベクトルについては、特に、ソート操作を任意の順序(昇順または降順)で実行することができます。
C++でベクトルを昇順に並べ替える
C++のvectorは、アルゴリズムのヘッダーファイルに定義されたsort()関数を使用することで、簡単に昇順でソートすることができます。
sort関数は、与えられたデータ構造を並べ替え、返り値はありません。並べ替えは、渡された2つのイテレータまたは位置の間で行われます。3番目のパラメータは、要素の比較順序を決定します。
デフォルトでは、第三パラメータを渡さない場合、関数はそれをstd::less()関数とみなします。この関数は、2つの引数を比較して、最初の引数が他の引数より小さいかどうかに基づいてtrueまたはfalseを返します。
では、今度はC++でベクトルを昇順にソートする方法を見てみましょう。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
//vector initialisation
vector<int> vec {5, 4, 3, 2, 1};
cout<<"Before sorting vector : ";
for(auto i=vec.begin(); i<vec.end(); i++)
{
cout<<" "<<*i;
}
std::sort(vec.begin(),vec.end());//Sorting the vector
cout<<"\n\nAfter sorting vector : ";
for(auto i=vec.begin(); i<vec.end(); i++)
{
cout<<" "<<*i;
}
return 0;
}
出力:
Before sorting vector : 5 4 3 2 1
After sorting vector : 1 2 3 4 5
C++においてベクトルを降順に並べ替える
前述したように、C++におけるsort()関数の第三引数はソートの順序を決定します。したがって、我々はそれに関数を定義して、任意のベクトルを望む順序(この場合は降順)でソートすることができます。
1. sort()でgreater()を使用する。
less()関数に似て、greater()関数も真偽値を返しますが、逆の意味です。もしも最初の引数が2番目の引数よりも大きければ、関数はtrueを返し、そうでない場合はfalseを返します。
どのように使用するかを見て、降順に並べられたベクトルを取得する方法を見てみましょう。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
//vector initialisation
vector<int> vec { 2,4,6,8,10 };
cout<<"Before sorting vector : ";
for(auto i=vec.begin(); i<vec.end(); i++)
{
cout<<" "<<*i;
}
std::sort(vec.begin(),vec.end(), greater<int>());//Sorting the vector using greater<int>() function
cout<<"\n\nAfter sorting vector : ";
for(auto i=vec.begin(); i<vec.end(); i++)
{
cout<<" "<<*i;
}
return 0;
}
出力:
Before sorting vector : 2 4 6 8 10
After sorting vector : 10 8 6 4 2
2. sort()の中でラムダ式を使用する。
C++11以降、C++プログラミングにおいてラムダ式の使用が導入されました。それらは単純な1行の関数であり、宣言を必要とせず、戻り値型の指定も必要ありません。
したがって、私たちはsort()関数によってソートの順序を決定するために、独自に定義したラムダ式を使用することができます。これは、sort()関数の第3パラメータとして、1行の式を定義することで行われます。どのように行われるか見てみましょう。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
//vector initialisation
vector<int> vec { 11,22,33,44,55 };
cout<<"Before sorting vector : ";
for(auto i=vec.begin(); i<vec.end(); i++)
{
cout<<" "<<*i;
}
std::sort(vec.begin(),vec.end(), [](int &a, int &b){ return a>b; });
//Sorting the vector using user-defined lambda expression(return type bool)
cout<<"\n\nAfter sorting vector : ";
for(auto i=vec.begin(); i<vec.end(); i++)
{
cout<<" "<<*i;
}
return 0;
}
以下の文を日本語で言い換えてください。1つのオプションで構いません:
Output: 出力:
Before sorting vector : 11 22 33 44 55
After sorting vector : 55 44 33 22 11
以下のコードでは、ベクトルから渡された2つの引数を比較するためにa>bの表現が使用されています。上記のコードの出力から分かるように、ベクトルは望む通り降順にソートされます。
結論
ですので、この記事ではC++でベクトルを昇順と降順の両方でソートする方法について学びました。このトピックに関するさらなる質問があれば、コメント欄を自由にご利用ください。
参考文献
- Sorting in STL – JournalDev Tutorial,
- – C++ algorithm Library,
- How to sort an STL vector? – StackOverflow Question,
- Sorting a vector in descending order – StackOverflow Question.