C ++はvector <int>をvector <double>に変換します


93

変換するための良いクリーンな方法は何であるstd::vector<int> intVecにはstd::vector<double> doubleVec。または、より一般的には、変換可能な型の2つのベクトルを変換しますか?

回答:


164

std::vectorの範囲コンストラクタを使用します。

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());

では、そのstd::copy(...)関数を使用することもできますか?それを答えに追加してもらえますか?
アランチューリング

3
@Lex:、copy(v_int.begin(), v_int.end(), back_inserter(v_float));またはv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy

1
悪い考えです。コンストラクタバージョンでは、イテレータカテゴリを使用してベクターのサイズを事前に設定し、それらがランダムアクセスイテレータであることを示し、十分なスペースを確保するためです。コピー前のサイズ変更は、無駄なゼロ初期化です。
Michael Goldshteyn

1
@MichaelGoldshteynわかりません。事前にサイズを指定しないと、容量を超えると自動的にサイズが変更されます(すべての要素が繰り返しコピーされます)。さて、これは償却された線形時間ですが、それでも単一の0の初期化よりもずっと遅いと思います。私はあなたの議論について何か不足していますか?
アルゴマン、

1
@Algomanは、std::distance()「ランダムアクセス反復子の場合、関数はoperator-を使用してこれを計算します。それ以外の場合、関数は増加演算子(operator ++)を繰り返し使用します。」したがって、この場合、要素の量はイテレータを差し引くことでわかります。標準のライブラリがstd :: distanceを使用して初期のreserve()を実装するかどうかは別の問題ですが、godbolt.org / z / 6mcUFhには少なくともstd :: distance()への呼び出しが含まれています。
user1556435
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.