C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++ STL】set::emplace_hint()関数の使い方を徹底解説

本記事では、C++ STLにおける set::emplace_hint() 関数について、その構文、動作の仕組み、戻り値を詳しく解説します。

C++ STLにおけるsetとは?

C++ STLのsetは、重複しない一意な要素を保持するコンテナであり、通常はソートされた順序で要素を管理します。setの要素は「値そのもの」が識別子として機能するため、同じ値を複数持つことはできません。一度setコンテナに追加した値は後から変更できませんが、要素の削除や追加は自由に行えます。setは内部的に二分探索木(バイナリサーチツリー)として実装されており、高速な検索を実現しています。

set::emplace_hint()とは

emplace_hint() 関数は、C++ STLに組み込まれた関数で、<set> ヘッダーファイル内で定義されています。この関数は、位置情報(ヒント)を指定しながら新しい要素をsetコンテナに挿入します。

emplace_hint() を呼び出す際には、挿入したい要素とともに位置を渡します。この位置は「ヒント」として機能し、挿入先の候補地点から検索を開始することで処理を高速化します。ただし、要素が実際に挿入されるのは、挿入しようとする値と等しい値がコンテナ内に存在しない場合のみです。関数はヒント位置から探索を行い、要素を挿入すべき適切な位置を見つけます。

構文

Set1.emplace_hint(iterator position, const type_t& value);

パラメータ

この関数は2つのパラメータを受け取ります。1つ目はヒント位置、2つ目は挿入する要素です。

position(位置) − 検索を開始するヒント位置です。ここから探索を始めて、挿入すべき値の適切な位置を特定します。この位置はあくまで処理を高速化するための目安であり、要素を挿入する正確な場所を強制するものではありません。

value(値) − 実際に挿入したい値です。

戻り値

要素の挿入が成功した場合、この関数は新しく挿入された要素を指すイテレータを返します。挿入が失敗した場合(同値の要素が既に存在する場合)は、既存の要素を指すイテレータが返されます。

使用例

Input: set mySet;
mySet.emplace_hint(mySet.begin(), 0);
mySet.emplace_hint(i, 1);
mySet.emplace_hint(i, 2);
mySet.emplace_hint(i, 1);
Output: Elements are : 0 1 2

サンプルコード①:整数のsetへの挿入

#include <bits/stdc++.h>
using namespace std;
int main(){
   set<int> mySet;
   auto i = mySet.emplace_hint(mySet.begin(), 0);
   i = mySet.emplace_hint(i, 1);
   mySet.emplace_hint(i, 2);
   mySet.emplace_hint(i, 1);
   cout<<"elements are : ";
   for (auto i = mySet.begin(); i != mySet.end(); i++)
      cout << *i<< " ";
   return 0;
}

出力結果

上記のコードを実行すると、以下の出力が生成されます。

Elements are : 0 1 2

この例では、最後に 1 を挿入しようとしていますが、setには既に 1 が存在するため、重複した要素は挿入されません。これにより、setが一意な要素のみを保持することが確認できます。

サンプルコード②:文字列のsetへの挿入

#include <iostream>
#include <set>
#include <string>
int main (){
   std::set<std::string> mySet;
   auto i = mySet.cbegin();
   mySet.emplace_hint (i,"best");
   i = mySet.emplace_hint (mySet.cend(),"point");
   i = mySet.emplace_hint (i,"is the");
   i = mySet.emplace_hint (i,"tutorials");
   std::cout<<"string is : ";
   for(const std::string& str: mySet)
      std::cout << ' ' << str;
   std::cout << '\n';
   return 0;
}

出力結果

上記のコードを実行すると、以下の出力が生成されます。

String is : best is the point tutorials

文字列の場合も同様に、setは自動的に要素をソートされた順序で保持します。ヒント位置を正しく指定することで、挿入処理の効率を向上させることができます。

  1. C++ STLのatan2()関数の使い方を徹底解説!構文・戻り値・サンプルコード付き

    atan2()関数は、座標yとxから逆正接(アークタンジェント)を求めるための関数です。ここでいうyとxは、それぞれy座標とx座標の値を指します。atan2()はC++のSTL(標準テンプレートライブラリ)に組み込まれている関数で、<cmath>ヘッダをインクルードすることで利用できます。通常のatan()関数と異なり、atan2()はxの符号も考慮して正しい象限の角度を返すため、実務でも広く使われています。atan2()関数の構文atan2(dataType var1, dataType var2)構文を見ると分かるように、atan2()関数はfloat型、double型、lon

  2. C++ STLのacos()関数とは?使い方をサンプルコード付きで解説

    C++ STLのacos()関数とはacos()関数は、ラジアン単位で与えられた値に対する逆余弦(アークコサイン)を返す関数で、C++のSTLに標準で組み込まれています。この関数は<cmath>ヘッダで定義されています。acos()関数の構文acos(var)構文から分かるように、acos()関数はfloat、double、long doubleのいずれかのデータ型を持つ引数varを1つ受け取ります。引数の値は-1から1の範囲内でなければなりません。範囲外の値を渡した場合はNaN(非数)が返される点に注意が必要です。戻り値は、-πからπの範囲におけるvarの逆余弦(ラジアン単位)で