C++ STL のベクトルコンテナ

胡金庫 2023年10月12日
  1. C++ で std::vector を使用して動的配列を構築する
  2. C++ で std::vector を使用して struct オブジェクトをに格納する
  3. C++ で std::vector::swap 関数を使用してベクトル要素を交換する
C++ STL のベクトルコンテナ

この記事では、C++ で vector コンテナを使用する方法に関する複数の方法を紹介します。

C++ で std::vector を使用して動的配列を構築する

std::vector はコンテナライブラリの一部であり、要素を連続したストレージに格納する動的にサイズ変更可能な配列を実装します。vector 要素は通常、push_back または emplace_back 組み込み関数で最後に追加されます。vector コンテナは、次のサンプルコードに示すように初期化リストを使用して簡単に構築できます-arr オブジェクト。また、静的初期化リスト値をマクロ式に格納し、必要に応じて初期化操作を簡潔に表現することもできます。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

#define INIT \
  { "Neque", "porro", "quisquam", "est", "qui", "dolorem", "ipsum", "quia" }

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<string> arr = {"Neque", "porro",   "quisquam", "est",
                        "qui",   "dolorem", "ipsum",    "quia"};
  printVector(arr);

  cout << endl;

  vector<string> arr2 = INIT;
  printVector(arr2);

  cout << endl;

  return EXIT_SUCCESS;
}

C++ で std::vector を使用して struct オブジェクトをに格納する

std::vector を使用して、カスタム定義の構造を格納し、前の例と同様にブレースリスト表記で初期化できます。push_back 関数を使用して新しい struct 要素を追加するときは、値をブレースリストとして渡す必要があり、struct 内にネストされた構造体が複数ある場合は、対応する表記を使用する必要があることに注意してください。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

struct cpu {
  string wine;
  string country;
  int year;
} typedef cpu;

int main() {
  vector<cpu> arr3 = {{"Chardonnay", "France", 2018}, {"Merlot", "USA", 2010}};

  for (const auto &item : arr3) {
    cout << item.wine << " - " << item.country << " - " << item.year << endl;
  }

  arr3.push_back({"Cabernet", "France", 2015});
  for (const auto &item : arr3) {
    cout << item.wine << " - " << item.country << " - " << item.year << endl;
  }

  return EXIT_SUCCESS;
}

C++ で std::vector::swap 関数を使用してベクトル要素を交換する

std::vector は、その要素を操作するための複数の組み込み関数を提供します。そのうちの 1つは swap です。これは vector オブジェクトから呼び出すことができ、引数として別の vector を使用して内容を交換できます。もう 1つの便利な関数は size です。これは、指定された vector オブジェクトの現在の要素数を取得します。ただし、現在割り当てられているバッファに格納されている要素の数を返す capacity と呼ばれる同様の関数があることに注意してください。後者は、オペレーティングシステムサービスへの不要な呼び出しを回避するために、より大きなサイズが割り当てられる場合があります。次のサンプルコードは、2つの関数が異なる値を返すシナリオを示しています。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<int> arr4 = {1, 12, 45, 134, 424};
  vector<int> arr5 = {41, 32, 15, 14, 99};

  printVector(arr4);
  arr4.swap(arr5);
  printVector(arr4);

  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;

  for (int i = 0; i < 10000; ++i) {
    arr4.push_back(i * 5);
  }

  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;
  arr4.shrink_to_fit();
  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;

  return EXIT_SUCCESS;
}

出力:

1, 12, 45, 134, 424,
41, 32, 15, 14, 99,
arr4 capacity: 5 size: 5
arr4 capacity: 10240 size: 10005
arr4 capacity: 10005 size: 10005
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Vector