2017-11-30 1 views
2

文字列型のベクトルにデータを挿入しようとしていて、文字列のメモリが定期的に更新されています。これらのプロセスでは、私はサイズを更新するたびにメモリの再割り当てが行われるため、リザーブ機能が問題をほぼ解決していることも読み取っています。 - >String & vectorC++でVector Of Stringsのreserve()関数

私のベクターは1024以上のスロットが必要ではなく、各文字列には10文字のスペースが必要です。 私のベクトル用に1024のメモリスロットを予約しました。

vector<string> power_set; 
power_set.reserve(1024); 

しかし、ベクトルスロット内にある文字列のメモリスロットを予約する方法はありますか?

ありがとうございました。

+1

文字列に 'reserve()'関数があります。したがって、コンテナを繰り返し処理し、各文字列に十分なスペースを確保することができます。 –

+0

'std :: string'の代わりに' std :: array 'を使うことを検討しましたか? –

+5

小さな文字列の最適化が割り当てを回避するので、実際には10文字の文字列の予約を呼び出す必要はありません。 – Timbo

答えて

1

私のベクトルは1024スロット以上必要ではなく、各文字列は10文字のスペースが必要です。その後

MyStringクラスの次の(部分)の定義を検討:すなわち(std::vectorreserveを呼び出すときに、文字列のために必要なメモリがMyStringに含まれる、MyString代わりのstd::stringを使用することにより

#include <array> 
#include <string> 

class MyString { 
    std::array<std::string::value_type, 10> str; 

public: 
// ... 
}; 

を:strstd::array)は、割り当てられます:

vector<MyString> power_set; 
power_set.reserve(1024); 
0

文字列にreserveを使用することもできます。私はベクトルに熟練しているわけではありませんが、文字列フィールドに特定の数の文字を割り当て、代わりにそのクラスのベクトルを作るカスタムクラスを作ることができます。

0

私はカスタムのアロケータを作成します。カスタムアロケータは、要求されたときに必ず10バイトを返します。しかし、私は早すぎる最適化のように聞こえると言わなければなりません。

関連する問題