C++ STL のベクトルコンテナ
-
C++ で
std::vector
を使用して動的配列を構築する -
C++ で
std::vector
を使用してstruct
オブジェクトをに格納する -
C++ で
std::vector::swap
関数を使用してベクトル要素を交換する
この記事では、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