はじめに
C++でvector
やmap
などのコンテナを扱う際、最も基本的な操作が「要素の追加」です。コンテナの種類によって、最適な追加方法が異なります。
この記事では、代表的な2つの要素追加方法を解説します。
emplace_back
:vector
などのシーケンスコンテナで、効率的に要素を末尾に追加する。insert
:map
やset
などの連想コンテナに、要素を追加する。
1. vector
に要素を末尾に追加する (emplace_back
)
std::vector
の末尾に要素を追加する場合、.push_back()
が一般的ですが、C++11以降では、より効率的な .emplace_back()
の使用が推奨されます。
.emplace_back()
は、コンストラクタの引数を直接受け取り、コンテナのメモリ領域に**直接オブジェクトを構築(in-place construction)**します。これにより、一時的なオブジェクトの作成とコピー(またはムーブ)が不要になり、パフォーマンスが向上します。
サンプルコード
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 複数のメンバを持つクラス
class Item {
public:
string name;
int price;
// コンストラクタ
Item(string n, int p) : name(n), price(p) {
cout << "(Item「" << name << "」が構築されました)" << endl;
}
};
int main() {
vector<Item> items;
cout << "--- emplace_backで要素を追加 ---" << endl;
// Itemクラスのコンストラクタ引数を直接渡す
items.emplace_back("りんご", 120);
items.emplace_back("みかん", 80);
cout << "\n--- 結果 ---" << endl;
for (const auto& item : items) {
cout << item.name << ": " << item.price << "円" << endl;
}
return 0;
}
解説: items.emplace_back("りんご", 120);
のように、追加したいクラスのコンストラクタ引数をそのまま渡すことで、vector
の内部で直接Item
オブジェクトが生成されます。
2. map
に要素を追加する (.insert
)
std::map
やstd::set
のような連想コンテナでは、.insert()
メンバ関数を使って要素を追加します。
.insert()
は、挿入が成功したかどうかや、挿入された要素を指すイテレータを含むペア (std::pair
) を返します。
サンプルコード
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
map<string, int> stock;
// 1. .insert()で要素を追加
// 戻り値の.secondは、挿入が成功したか(true)を示すbool値
auto result1 = stock.insert({"apple", 10});
cout << "appleの挿入成功? -> " << boolalpha << result1.second << endl;
stock.insert({"orange", 18});
// 2. 既に存在するキーでinsert()を試みる
auto result2 = stock.insert({"apple", 99}); // キーが重複している
cout << "appleの再挿入成功? -> " << boolalpha << result2.second << endl;
cout << "\n--- 最終的なmapの状態 ---" << endl;
for (const auto& [key, value] : stock) {
cout << key << ": " << value << endl;
}
return 0;
}
解説:
map
はキーの重複を許しません。そのため、stock.insert({"apple", 99})
を実行しても、キー"apple"
は既に存在するため、挿入は失敗し、元の値10
が保持されます。.insert()
が返すペアの.second
メンバ(bool
値)をチェックすることで、挿入が成功した (true
) か、キーが重複していて失敗した (false
) かを判別できます。
まとめ
今回は、C++のコンテナに要素を追加する主要な方法を解説しました。
- **
vector
などシーケンスコンテナの末尾追加には、効率的な.emplace_back()
**が推奨される。 - **
map
など連想コンテナには.insert()
**を使い、戻り値で挿入の成否を確認できる。
コンテナの特性に合った適切な追加方法を選択することが、効率的で堅牢なコードを書くための第一歩です。