C++ STLのset::insert()関数を解説!構文・戻り値・サンプルコード付き
本記事では、C++ STLにおけるset::insert()関数について、その構文、動作の仕組み、そして戻り値の違いを詳しく解説します。
C++ STLにおけるsetとは?
C++ STLのsetは、重複しない一意な要素を格納するコンテナです。要素の値そのものがその要素を識別するキーとなるため、同じ値を複数保持することはできません。一度セットに追加した値は後から変更できませんが、要素の削除や追加自体は自由に行えます。内部的には二分探索木(平衡二分木)として実装されており、高速な検索・挿入・削除を実現しています。
set::insert()とは?
insert()関数は、<set>ヘッダーファイルで定義されているC++ STLの組み込み関数で、setコンテナに要素を挿入するために使用されます。要素を挿入すると、コンテナのサイズは挿入された要素の数だけ増加します。
setは一意な値のみを保持するため、insert()は単純に要素を追加するだけでなく、まず挿入しようとする要素がすでに存在していないかを確認します。さらに、setではすべての要素が常にソートされた状態で保持されるため、新しく挿入する要素も自動的に適切なソート位置へ配置されます。
構文
Set1.insert(const type_t &value); ----(1) または Set1.insert(iterator position, const type_t &value); -----(2) または Set1.insert(iterator position_1, iterator position_2); -----(3)
パラメータ
value − setコンテナに挿入したい値です。
position − 挿入位置のヒントです。検索はこの位置から開始され、要素が適切に配置される場所へ挿入されます。ヒントが正確であれば、挿入処理を高速化できる場合があります。
position_1, position_2 − 挿入する範囲を指定するイテレータです。position_1が範囲の先頭、position_2が範囲の末尾を示し、この間にあるすべての要素が挿入されます。
戻り値
この関数は、渡された引数の形式に応じて異なる値を返します。
値のみを渡した場合:挿入された要素を指すイテレータと、挿入が成功したかどうかを示すbool値のペア(
std::pair<iterator, bool>)を返します。すでに同じ値が存在する場合は挿入されず、boolがfalseになります。positionとvalueを渡した場合:挿入された要素を指すイテレータを返します。
position_1とposition_2を渡した場合:戻り値はありません(void)。指定された範囲の要素がすべてまとめて挿入されます。
使用例
Input: set<int> myset;
myset.insert(10);
Output: values in the set = 10
Input: set<int> myset = {11, 12, 13, 14};
myset.insert(myset.begin(), 10);
Output: values in the set = 10 11 12 13 14
サンプルコード①:要素を順番に挿入する
setに対して要素を1つずつ順番に挿入する基本的な例です。
#include <bits/stdc++.h>
using namespace std;
int main(){
set<int> mySet;
mySet.insert(10);
mySet.insert(20);
mySet.insert(30);
mySet.insert(40);
mySet.insert(50);
cout<<"Elements are: ";
for (auto i = mySet.begin(); i != mySet.end(); i++)
cout << *i << " ";
return 0;
}
出力結果
上記のコードを実行すると、以下の出力が得られます。
Elements are : 10 20 30 40 50
サンプルコード②:位置ヒントを指定して挿入する
挿入位置のヒント(イテレータ)を活用して要素を挿入する例です。ヒントを指定しても、最終的な並び順は自動的にソートされます。
#include <bits/stdc++.h>
using namespace std;
int main(){
set<int> mySet;
auto i = mySet.insert(mySet.begin(), 10);
i = mySet.insert(i, 20);
i = mySet.insert(i, 40);
i = mySet.insert(i, 30);
i = mySet.insert(i, 80);
i = mySet.insert(mySet.end(), 90);
cout<<"Elements are: ";
for (auto i = mySet.begin(); i != mySet.end(); i++)
cout << *i << " ";
return 0;
}
出力結果
上記のコードを実行すると、以下の出力が得られます。
Elements are: 10 20 30 40 80 90
-
【C++ STL】multisetのinsert()関数の使い方とサンプルコードを解説
C++ STLのmultiset(マルチセット)コンテナにおけるinsert()関数は、新しい要素をコンテナへ挿入するためのメンバ関数です。単に値を指定して挿入する形式と、挿入位置のヒントとなるイテレータを指定する形式があり、状況に応じて使い分けられます。multisetは重複した値を許可し、挿入された要素は常に自動的にソートされた状態で保持されるという特徴を持っています。 使用する主なメンバ関数 ms.size() … マルチセットに現在格納されている要素数を返します。 ms.insert(値) … 指定した値をマルチセットに挿入し、挿入された要素を指すイテレータを返します。 ms.ins
-
C++ STLにおけるemplace()とinsert()の違いと使い方
C++ STLにおけるemplace操作は、オブジェクトの不要なコピーを回避し、insert操作よりも効率的に要素を挿入できる点が大きな特徴です。insert操作は既存オブジェクトへの参照を受け取るため、コンテナに挿入する際にコピー(またはムーブ)が発生します。一方、emplaceは渡された引数をコンテナ内で直接オブジェクトとして構築するため、余分なコストを抑えられます。emplaceとinsertの違いemplace(): 引数をコンテナに転送し、コンテナ内で直接オブジェクトを構築します(in-place構築)。一時オブジェクトの生成やコピーが不要なため効率的です。insert(): 既存の