【C++】コンテナに要素を追加する方法 (emplace_back, insert)

目次

はじめに

C++でvectormapなどのコンテナを扱う際、最も基本的な操作が「要素の追加」です。コンテナの種類によって、最適な追加方法が異なります。

この記事では、代表的な2つの要素追加方法を解説します。

  1. emplace_back: vectorなどのシーケンスコンテナで、効率的に要素を末尾に追加する。
  2. insert: mapsetなどの連想コンテナに、要素を追加する。

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::mapstd::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()**を使い、戻り値で挿入の成否を確認できる。

コンテナの特性に合った適切な追加方法を選択することが、効率的で堅牢なコードを書くための第一歩です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次