C++ STLのset::cbegin()とset::cend()関数を徹底解説
本記事では、C++ STLにおけるset::cbegin()関数とset::cend()関数について、その構文、動作、戻り値を詳しく解説します。
C++ STLにおけるsetとは?
C++ STLのsetは、必ず一意(重複なし)の要素を保持するコンテナです。set内では要素の値そのものがその要素を識別するため、同じ値を複数持つことができません。一度setコンテナに追加された値は後から変更できませんが、要素の削除や追加は可能です。内部的にはsetは二分探索木として実装されており、要素は常にソートされた順序で自動的に保持されます。
set::cbegin()とは
cbegin()関数はC++ STLに組み込まれた関数で、<set>ヘッダーファイルで定義されています。この関数は、setコンテナの最初の要素を指す定数イテレータ(const_iterator)を返します。setコンテナのイテレータはすべて定数イテレータであるため、これらを使ってコンテナの内容を変更することはできません。できるのは、イテレータをインクリメントまたはデクリメントして、setコンテナの要素間を走査することだけです。
構文
constant_iterator name_of_set.cbegin();
パラメータ
この関数は引数を受け取りません。
戻り値
この関数は、setコンテナの先頭要素を指す定数イテレータ(const_iterator)を返します。
例
入力: set<int> set_a = {18, 34, 12, 10, 44};
set_a.cbegin();
出力: setコンテナの先頭要素: 10サンプルコード
#include <iostream>
#include <set>
using namespace std;
int main (){
set<int> set_a = {18, 34, 12, 10, 44};
cout << "setコンテナの先頭要素: ";
cout << *(set_a.cbegin());
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます −
setコンテナの先頭要素: 10
例(set全体を走査)
#include <iostream>
#include <set>
using namespace std;
int main (){
set<int> set_a = {18, 34, 12, 10, 44};
cout << "set_a の内容:";
for (auto it = set_a.cbegin(); it != set_a.cend(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます −
set_a の内容: 10 12 18 34 44
set::cend()とは
cend()関数もC++ STLに組み込まれた関数で、<set>ヘッダーファイルで定義されています。この関数は、setコンテナの最後の要素の「次」の位置を指す定数イテレータ(const_iterator)を返します。setコンテナのイテレータはすべて定数イテレータであるため、コンテナの内容を変更することはできず、イテレータをインクリメントまたはデクリメントして要素間を走査することしかできません。
構文
constant_iterator name_of_set.cend();
パラメータ
この関数は引数を受け取りません。
戻り値
この関数は、シーケンスの末尾(最後の要素の次の位置)を指す定数イテレータ(const_iterator)を返します。
例
入力: set<int> set_a = {18, 34, 12, 10, 44};
set_a.cend();
出力: 末尾の次の位置を指すイテレータset::cend()は末尾の次の要素を指すため、cbegin()やbegin()と組み合わせてset全体を走査する際に使用されます。
サンプルコード(cend()の参照外し)
#include <iostream>
#include <set>
using namespace std;
int main (){
set<int> set_a = {18, 34, 11, 10, 44};
cout << "末尾の次の要素: ";
cout << *(set_a.cend());
return 0;
}
出力
上記のコードを実行すると、次のような結果になります −
注意: これは未定義動作であり、ランダムな値(ゴミ値)が出力される可能性があります
cend()が指すのは有効な要素ではないため、そのまま参照外し(*演算子)を行うのは避けるべきです。cend()はあくまで「終端の判定」に使うものです。
例(cbegin()とcend()で全要素を走査)
#include <iostream>
#include <set>
using namespace std;
int main (){
set<int> set_a = {18, 34, 12, 10, 44};
cout << "set_a の内容:";
for (auto it = set_a.cbegin(); it != set_a.cend(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます −
set_a の内容: 10 12 18 34 44
まとめ
set::cbegin()はコンテナの先頭要素を指す定数イテレータを返し、set::cend()は最後の要素の次の位置を指す定数イテレータを返します。両者を組み合わせることで、setの全要素を読み取り専用で安全に走査できます。要素を変更する予定がない場合は、begin()/end()の代わりにcbegin()/cend()を使用することで、誤った変更を防ぎ、コードの意図をより明確に表現できます。
-
C++ STLのset find()関数の使い方を解説
C++ STLのsetコンテナにおけるfind()関数は、指定した要素を検索し、その要素を指すイテレータを返します。もし要素がセット内に存在しない場合は、最後の要素の直後の位置(つまりend()が返すイテレータ)を指す値が返されます。この関数の計算量はO(log n)であり、setが内部的に平衡二分探索木(赤黒木)で実装されているため、高速な検索が可能です。アルゴリズムBegin セットコンテナの要素を出力するための関数 printS() を定義する。 空のセットコンテナ s を初期化し、いくつかの要素を挿入する。 関数を呼び出して、セットコンテナの要素を出力する。
-
C++のSTL set(セット)における要素の挿入と削除の基本
C++のSTL(標準テンプレートライブラリ)に含まれる set コンテナは、重複しない要素を自動的にソートして管理する便利なデータ構造です。本記事では、setへの挿入と削除の方法を、実際に動作するサンプルコードと出力例とともに詳しく解説します。 要素の挿入:insert() STLのsetに要素を挿入するには、insert() 関数を使用します。insert() はオブジェクトへの参照を受け取り、その要素を適切な位置(自動的にソートされた状態を保つ位置)に追加します。 すでに同じ値がセット内に存在する場合、重複した挿入は行われず、セットの内容は変化しません。これがsetコンテナの大きな特徴です