C++でアレイをvectorに変換する
この投稿では、C++でアレイをvectorに変換する方法について説明します。
1.範囲コンストラクターの使用
アイデアは、vectorのを使用することです 範囲コンストラクター これは、2つの入力イテレータによって定義された指定された範囲の要素からvectorを構築します。これは最も単純で非常に効率的なソリューションです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <vector> int main() { //入力アレイ int src[] = { 1, 2, 3, 4, 5 }; int n = sizeof(src) / sizeof(src[0]); std::vector<int> dest(src, src + n); for (int i: dest) { std::cout << i << " "; } return 0; } |
出力:
1 2 3 4 5
上記のプログラムは sizeof
アレイのサイズを計算するための演算子。導入されたC++11ではそれを回避できます std::begin
と std::end
シーケンスの最初と最後を指すイテレータを返す関数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <vector> int main() { //入力アレイ int src[] = { 1, 2, 3, 4, 5 }; std::vector<int> dest(std::begin(src), std::end(src)); for (int i: dest) { std::cout << i << " "; } return 0; } |
出力:
1 2 3 4 5
2.使用する std::insert
関数
別の効率的な解決策は、 std::insert
関数。 std::vector
のオーバーロードバージョンがあります std::insert
、これは3つのパラメーターを取ります。最初のパラメーターは宛先vectorへのイテレーターであり、最後の2つのパラメーターはアレイ要素の範囲を指定するイテレーターです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <vector> int main() { //入力アレイ int src[] = { 1, 2, 3, 4, 5 }; std::vector<int> dest; dest.insert(dest.begin(), std::begin(src), std::end(src)); for (int i: dest) { std::cout << i << " "; } return 0; } |
出力:
1 2 3 4 5
3.ナイーブソリューション
単純な解決策は、アレイを反復し、そのすべての値を一度に1つずつvectorに追加する単純なforループを使用することです push_back()
関数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <vector> int main() { //入力アレイ int src[] = { 1, 2, 3, 4, 5 }; //空のvectorを作成し、すべての要素をプッシュします std::vector<int> dest; for (int i: src) { dest.push_back(i); } for (int i: dest) { std::cout << i << " "; } return 0; } |
出力:
1 2 3 4 5
4.使用する std::copy
関数
使用することもできます std::copy
STLアルゴリズム。指定された範囲の要素を、指定された出力イテレータから始まる別の範囲にコピーします。宛先vectorの最後に新しい要素を挿入する必要があるため、次を使用できます。 std::back_inserter
目的地の初期位置に。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <vector> #include <iterator> #include <algorithm> int main() { //入力アレイ int src[] = { 1, 2, 3, 4, 5 }; std::vector<int> dest; std::copy(std::begin(src), std::end(src), std::back_inserter(dest)); for (int i: dest) { std::cout << i << " "; } return 0; } |
出力:
1 2 3 4 5
vectorに十分なスペースがある場合は、出力イテレータを宛先範囲の先頭に指定するだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <vector> #include <algorithm> int main() { //入力アレイ int src[] = { 1, 2, 3, 4, 5 }; int n = sizeof(src) / sizeof(src[0]); std::vector<int> dest(n); std::copy(src, src + n, dest.begin()); for (int i: dest) { std::cout << i << " "; } return 0; } |
出力:
1 2 3 4 5
5.使用する memcpy()
関数
vectorは動的アレイにすぎないため、 memcpy()
関数もここで機能します。データのバイナリコピーを実行するため、エラーが発生しやすくなります。のアレイで使用できます POD(プレーンオールドデータ)タイプ int、charなどのようですが、構造体やクラスではお勧めしません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <cstring> #include <vector> int main() { //入力アレイ int src[] = { 1, 2, 3, 4, 5 }; int n = sizeof(src) / sizeof(src[0]); std::vector<int> dest(n); memcpy(&dest[0], &src[0], n*sizeof(int)); for (int i: dest) { std::cout << i << " "; } return 0; } |
出力:
1 2 3 4 5
6.使用する std::assign
関数
使用することもできます std::assign
vectorの既存の内容を指定された範囲の要素に置き換える関数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <vector> int main() { //入力アレイ int src[] = { 1, 2, 3, 4, 5 }; std::vector<int> dest; dest.assign(std::begin(src), std::end(src)); for (int i: dest) { std::cout << i << " "; } return 0; } |
出力:
1 2 3 4 5
これで、C++でアレイをvectorに変換できます。