C++ <vector> push_back 関数

C++ コンテナクラス <vector>


数多くのコンテナの中で、vector(ベクタ)は最も一般的で、自動的に長さが変わる配列に最も似ているものの1つであり、push_backこそが、この配列を長くするための重要な関数です。

push_backはメンバ関数であり、動的配列vector) 或その他のシーケンスコンテナ(例:list, deque)のの末尾に新しい要素を追加します。

push_backコンテナの動的成長を実現します、コンテナの最終的なサイズを事前に指定する必要はなく、プログラムの実行時の必要性に応じて、いつでもどこでも要素を追加できます。

単語の意味: pushは「プッシュ」、backは「後ろ」で、合わせると「後ろにプッシュする」となり、非常にイメージしやすいです。


基本構文とパラメータ

push_backはコンテナクラスのメンバ関数です。そのため、まずコンテナオブジェクトが必要で、次にドット演算子を介して.呼び出します。

構文形式

void push_back(const T& value);
void push_back(T&& value);  // C++11 之后(支持右值)

パラメータの説明

  • パラメータ: value
    • 型: コンテナ定義時に指定した要素型と同じか、その型に変換できる値。
    • 説明: コンテナの末尾に追加したい値。変数、リテラル(例:10, "hello")、または式の結果です。

関数の説明

  • 戻り値: void(戻り値なし)。その役割は純粋に「要素を追加する」ことであり、追加が完了すると関数は終了します。
  • 効果: コンテナのsize()(現在の要素数) が 1 増えます。新しい要素はコンテナの最後の要素になります。

実例

簡単なものから複雑なものまで一連の例を通して、push_backの使い方を完全にマスターしましょう。

例1:基本的な使い方 - 整数を管理する

実例

#include <iostream>
#include <vector> // 1. vector ヘッダーファイルを必ずインクルードする

int main() {
    // 2. 整数を格納するための空の vector を作成する
    std::vector<int> numbers;

    std::cout << "初期状態では、vector のサイズは: " << numbers.size() << std::endl;

    // 3. push_back を使用して要素を追加する
    numbers.push_back(10); // 末尾に整数 10 を追加する
    numbers.push_back(20); // 10 の後ろに 20 を追加する
    numbers.push_back(30); // 20 の後ろに 30 を追加する

    std::cout << "追加後、vector のサイズは: " << numbers.size() << std::endl;

    // 4. すべての要素を走査して出力し、追加順序を確認する
    std::cout << "vector の要素は: ";
    for(int i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " "; // 配列のように添え字でアクセスする
    }
    std::cout << std::endl;

    return 0;
}

実行結果の予想:

初始时,vector的大小是: 0
添加后,vector的大小是: 3
vector中的元素是: 10 20 30

コードの解説:

  1. #include <vector>は、vectorvectorコンテナを使用するための前提条件です。
  2. std::vector<int> numbers;という名前のnumbers空の vector を作成しますvector、これは将来intint 型の整数を格納します。
  3. 3回のpush_back呼び出しにより、順に10, 20, 30をnumbersの末尾に追加します。追加順序は、要素がvector中での最終的な順序です。
  4. numbers.size()現在の要素数を返します。numbers[i]添え字で要素にアクセスします。配列と同じ使い方です。

例2:文字列を管理する

vector数値だけでなく、文字列や独自定義型など、あらゆるデータ型を格納できます。

実例

#include <iostream>
#include <vector>
#include <string> // string を使用する場合もヘッダーファイルのインクルードが必要

int main() {
    // std::string を格納する vector を作成する
    std::vector<std::string> tasks;

    // push_back を使用して TODO 項目を追加する
    tasks.push_back("C++ の push_back を学ぶ");
    tasks.push_back("宿題をする");
    tasks.push_back("技術ドキュメントを読む");

    std::cout << "今日の TODO (" << tasks.size() << " 件):\n";
    // 範囲 for ループ (C++11) を使用して走査すると、より簡潔
    for(const auto& task : tasks) {
        std::cout << "- " << task << std::endl;
    }

    return 0;
}

実行結果の予想:

今日待办事项 (3 项):
- 学习 C++ push_back
- 写作业
- 阅读技术文档

コードの解説:

  • std::vector<std::string>要素の型がstd::stringであるコンテナを宣言しています。
  • push_backのパラメータは文字列リテラルです(自動的にstd::string)。
  • for(const auto& task : tasks)は C++11 で導入された「範囲ベースの for ループ」であり、自動的にtasks中のすべての要素を走査するため、非常に便利です。autoコンパイラにtaskの型を自動推定させます。

例3:コンテナの内容を動的に構築する

これはpush_backの最も強力な点です。実行時のデータ(ユーザー入力やファイル読み取りなど)に基づいてコンテナを構築します。

実例

#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores;
    int inputScore;
    char continueFlag = 'y';

    std::cout << 学生の成績を入力してください (数字以外を入力すると終了):\n";
    // 方法1: ユーザー入力に基づいてループを制御する
    while(std::cin >> inputScore) {
        scores.push_back(inputScore);
    }

    // 後続の入力に備えて cin のエラー状態をクリアする
    std::cin.clear();
    std::cin.ignore(10000, '\n');

    // 方法2: 続行するかどうかを尋ねる
    /*
    while(continueFlag == 'y' || continueFlag == 'Y') {
std::cout << "成績を入力してください: ";
        std::cin >> inputScore;
        scores.push_back(inputScore);

std::cout << "続けて入力しますか? (y/n): ";
        std::cin >> continueFlag;
    }
    */


    std::cout << "\n合計 " << scores.size() << " 個の成績が入力されました。\n";
    if(!scores.empty()) { // コンテナが空かどうかを判定する
        int sum = 0;
        for(int score : scores) {
            sum += score;
        }
        std::cout << "平均点は: " << static_cast<double>(sum) / scores.size() << std::endl;
    }

    return 0;
}

この例は、...を使ってpush_backループ内でコンテナを動的に埋め、最後に平均値を計算する方法を示しています。実行して、...を入力してみてください100 90 85 a(最後に文字aを入力して数字入力ループを終了します)。


C++ コンテナクラス <vector>

その他の拡張