C++ STLで使える知られざる便利テクニック集
この記事では、C++のSTL(標準テンプレートライブラリ)に関連する、あまり知られていない実用的なテクニックを紹介します。競技プログラミングや日常のコーディングで役立つ内容ばかりなので、ぜひ覚えておきましょう。
波括弧「{}」を使ったpairへの代入
pairに値を代入するとき、make_pair()を使わなくても波括弧「{}」で直接初期化できます。入れ子になったpairやtupleにも同じ書き方が使えます。
pair<int, int> my_pair = make_pair(10, 20);
pair<int, int> my_pair2 = {10, 20}; // 波括弧を使用
pair<int, pair<char, int>> my_pair3 = {10, {'A', 20}}; // 入れ子のpair
すべてのヘッダーを一括でインクルードする
必要なヘッダー名をうっかり忘れてしまうこと、ありますよね。そんなときは、次の1行だけで標準ライブラリのほぼすべてのヘッダーを読み込めます。
#include <bits/stdc++.h>
※これはGCC系コンパイラ固有のヘッダーです。手軽さの反面、移植性が低下するため、本番コードでは個別のインクルードを推奨します。
組み込みのGCD関数「__gcd()」
C++には最大公約数(GCD)を求める組み込み関数が用意されています。知名度が低いため知らない人も多い関数ですが、以下のように簡単に使えます。
__gcd(a, b)
※GCCの拡張機能です。C++17以降では標準ライブラリの<numeric>にあるstd::gcd()が利用できるので、そちらを使うのがより安全です。
to_string():数値から文字列への変換
C++には、さまざまなデータ型を文字列に変換するto_string()関数があります。整数や浮動小数点数を文字列にしたい場合に便利です。
float x = 2.3654;
string str = to_string(x);
stoi():文字列から整数への変換
その逆、つまり文字列を整数に変換するにはstoi()関数を使います。
string num = "256";
int x = stoi(num);
グローバル変数と配列の初期化
関数の外で宣言した変数(グローバル変数)は静的記憶域を持つため、デフォルト値が自動的に0になります。一方、関数内で普通に宣言した配列には不定値(ゴミ値)が入るので注意が必要です。
すべての要素を0で初期化した配列を作りたい場合は、次のように宣言します。
int arr[10] = {};
memset()で配列をまとめて初期化する
memset関数を使えば、配列全体を指定したバイト値で埋めることができます。
int arr[10];
memset(arr, 0, sizeof(arr)); // 全要素を0で埋める
ただし、memsetはバイト単位で動作するため、0や-1以外の値(例えば5など)を指定すると意図しない結果になることがあります。各要素に任意の値を設定したい場合は、std::fill()を使うのが安全で確実です。
int arr[10];
fill(arr, arr + 10, 5); // 全要素を5に設定
-
C++ STLのスタック(stack)徹底解説!LIFO構造の基本操作とサンプルコード
C++ STLにおけるスタック(stack)は、LIFO(Last In First Out:後入れ先出し)構造として実装されるコンテナです。LIFOとは「最後に入れたものが最初に取り出される」という意味で、本を一冊ずつ積み上げた山をイメージすると理解しやすいでしょう。一番上に置いた本(=最後に挿入された要素)が最初に取り出されることから、この構造はLIFOと呼ばれています。 スタックで使える主な操作 1. top() – 最上位要素の取得 スタックの最上位(先頭)にある要素への参照を返します。要素自体は削除されません。 構文:name_of_stack.top() 引数:なし 戻り値:ス
-
C++でSTLを使って配列の積を求める方法
C++では、STL(標準テンプレートライブラリ)のaccumulate関数を利用することで、配列内のすべての要素の積を簡潔に求めることができます。ここでは、その具体的な実装例を紹介します。 アルゴリズム 開始 配列の各要素の値を初期化する。 ユーザー定義関数 accumulate を呼び出し、配列全体の積を取得する。 計算結果を出力する。 終了 サンプルコード #include <iostream> #include <numeric> using namespace std; int ProductOfArray(int p[], int n)