2016-12-07 15 views
0

文字の配列を持っていて、データをstd::vectorにプッシュしたい場合、これを行う最も速い方法は何ですか?私は現在push_backメソッドでループを使用しています。生の配列をstd :: vectorに渡す最速の方法

std::vector<char> vec; 
char test[] = {'0', '1', '2', '3' }; 
for(size_t i = 0; i < test.size(); ++i) 
    vec.push_back(test[i]); 

すべてのデータを一度にプッシュする方法はありますか?

答えて

3

配列の開始および終了イテレータをvectorコンストラクタに渡すだけです。

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    char test[] = {'0', '1', '2', '3' }; 
    std::vector<char> vec(begin(test), end(test)); 

    for(auto c: vec){ 
     cout << c << '\n'; 
    } 
} 

それが唯一の割り当てを行うために、ベクターが必要になりますので、これではなく、ベクトルの大きさが大きくなるにつれ、増分割り当てとコピーを、あなたの方法よりも高速になります。

vectorが配列の前に宣言されている場合は、ループの前にreserveを呼び出して、1回の割り当てだけが確実に行われるようにすることができます。

vec.reserve(distance(begin(test), end(test))); 

またはその代わりに、あなたのループの範囲を取るinsertのオーバーロードを使用します。

vec.insert (begin(vec), begin(test), end(test)); 

は、C++の配列がそうtest.size()が有効でない呼び出し、何のメンバ関数を持っていないことに注意してください。 std::arrayただし、メンバー関数はsizeです。

+0

私は 'end(test) - begin(test)'を使ってサイズを与えることができると思います。 –

+1

C++ 17以降、['std :: size(test)'](http://en.cppreference.com/w/cpp/iterator/size)を呼び出すことができます。 –

+0

おかげさまでちょっと怠けていましたが、ハードコードされたサイズを取り出すように更新しました。 –

関連する問題