C++ <vector> push_back 関数
数多くのコンテナの中で、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;
}
#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
コードの解説:
#include <vector>は、vectorvectorコンテナを使用するための前提条件です。std::vector<int> numbers;という名前のnumbers空の vector を作成しますvector、これは将来intint 型の整数を格納します。- 3回の
push_back呼び出しにより、順に10,20,30をnumbersの末尾に追加します。追加順序は、要素がvector中での最終的な順序です。 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;
}
#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;
}
#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を入力して数字入力ループを終了します)。
その他の拡張