C++ STLを使ってカスタムオブジェクトのvectorをソートする方法
C++では、STLが提供するstd::sort関数を使うことで、カスタムオブジェクトのvector(可変長配列)を簡単に並べ替えることができます。sort関数には、引数として「first(先頭イテレータ)」「last(末尾イテレータ)」「comparator(比較用の述語関数)」を受け取るオーバーロード版があります。firstとlastにはコンテナの最初と最後の要素を指すイテレータを渡し、comparatorにはコンテナをどのようにソートするかを指示する述語関数を指定します。
サンプルコード
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct MyStruct {
int key;
string data;
MyStruct(int key, string data) {
this -> key = key;
this -> data = data;
}
};
int main() {
std::vector<MyStruct> vec;
vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(3, "a"));
vec.push_back(MyStruct(1, "this"));
// C++11のラムダ式を使用
sort(vec.begin(), vec.end(), [](const MyStruct& lhs, const MyStruct& rhs) {
return lhs.key < rhs.key;
});
for(auto it = vec.begin(); it != vec.end(); it++) {
cout << it -> data << endl;
}
}
実行結果
このコードを実行すると、次のような出力が得られます。
this is a test
古いバージョンのC++で作業している場合は、ラムダ式の代わりに関数への参照(ポインタ)を渡すこともできます。
// 比較関数を定義:
bool comparator(const MyStruct& lhs, const MyStruct& rhs) {
return lhs.key < rhs.key;
}
// 定義した関数をsortに渡す:
sort(vec.begin(), vec.end(), &comparator);
さらに、クラスや構造体内で「<」演算子をオーバーロードすれば、sort(first, last) の形式をそのまま使用することも可能です。この場合、ソート実行時には自動的にこの演算子関数が呼び出され、要素同士の比較が行われます。
-
STLを使ったC++のvector(ベクトル)実装プログラム
std::vectorは、動的配列のように要素の挿入や削除に応じて自動的にサイズを変更できるコンテナで、メモリ(記憶域)の管理はコンテナ自身が行います。要素は連続したメモリ領域に配置されるため、イテレータを使ったアクセスや走査が可能です。また、先頭・中間・末尾のいずれの位置にもデータを挿入・削除できます。 使用する主な関数とその説明 v.size() : ベクトルのサイズ(現在の要素数)を返します。 v.push_back() : ベクトルの末尾に要素を挿入します。 v.pop_back() : ベクトルの末尾から要素を取り除きます。 v.capacity() : 現在ベクトルに
-
C++でSTLを使って配列の積を求める方法
C++では、STL(標準テンプレートライブラリ)のaccumulate関数を利用することで、配列内のすべての要素の積を簡潔に求めることができます。ここでは、その具体的な実装例を紹介します。 アルゴリズム 開始 配列の各要素の値を初期化する。 ユーザー定義関数 accumulate を呼び出し、配列全体の積を取得する。 計算結果を出力する。 終了 サンプルコード #include <iostream> #include <numeric> using namespace std; int ProductOfArray(int p[], int n)