この質問は、この質問に関連していますが、まったく同じではありません。
読みやすさ関連の問題以外に、任意のバイナリデータを保持するstd::vector<char>
代わりに使用することに利点はありますか?std::string
つまり、文字列と比較して、ベクトルを使用して実行する方が簡単/効率的/優れているタスクはありますか?
読みやすさ(過小評価されるべきではありません)は別として、私はstd::string
オーバーを使用することでいくつかのマイナーなパフォーマンス/メモリの問題を考えることができますstd::vector
:
最近のstd::string
実装の中には、小さな文字列の最適化を使用するものがあります。の内部バッファよりも大きいデータを格納している場合string
、それは悲観的なものになり、コピー、移動、およびswap
1の効率が低下し、利益がないために増加しsizeof()
ます。
効率的なstd::string
実装では、終了ヌルを格納するために、常に現在のサイズより少なくとも1バイト多く割り当てられます(そうしないとoperator[]
、対処するために追加のロジックが必要になりstr[size()]
ます)。
これらの問題はどちらも非常に軽微であることを強調する必要があります。それらのパフォーマンスコストは、バックグラウンドノイズで失われる可能性が高くなります。しかし、あなたは尋ねました。
1これらの操作は、小さな文字列の最適化が使用されている場合は分岐する必要がありますが、適切な実装size()
ではありません。std::vector
読みやすさを超えて、そして別のメンテナがの目的を混同しないようにすることで、std::string
機能に大きな違いはありません。もちろん、効率が唯一の考慮事項である場合は、char */mallocも考慮することができます。
私が考えることができる1つの潜在的な問題:
std::string
デフォルトはstoreing<char>
です。後で別のタイプ(unsigned shortなど)を処理する必要がある場合は、次のいずれかを行う必要があります。
std::basic_string<unsigned short>
から離れます)std::string
ベクトルを使用すると、コンテナをに変更するだけで済みますstd::vector<unsigned short>
。
vector<char>
確かに以上の機能がありますstring
。とは異なりstring
、操作中にイテレータ、参照などvector<char>
を保持することが保証されていswap
ます。参照:小さなバッファーstd::vector
の最適化を利用できますか?
それを行うことで得られる唯一の利点はstd::vector
、文字の増分が簡単になることだと思いますが、それでも。を使用して行うことができますstd::string
。
オブジェクトのように見えてもstd::string
、配列のようにアクセスできるため、文字列の特定の部分にアクセスする場合でも、std::vector
理想的にはvector<unsigned char>
、任意のバイナリデータを格納するために使用しますが、古い質問を参照したように、これはすでに知っていると思います。
それ以外は、文字列が終了ヌル文字を追加するため、ベクトルを使用するとメモリ効率が確実に向上します。割り当てメカニズムが両方で異なるため、パフォーマンスも向上する可能性があります-ベクトルは連続したメモリを保証します!
それに加えて、呼び出し元/ユーザーが誤って文字列メソッドの一部を呼び出す可能性があるため、文字列を使用することは正しくありません。これは災害になる可能性があります。
他の回答が述べているように、ベクトルは、小さなサイズでも連続したメモリを保証し、最後に余分なヌルバイトを追加しないため、わずかに高速になる可能性があります。ただし、2つのベクトルを連結するよりも、2つの文字列を連結する方が(コード的に)はるかに簡単です。
使用vector
:
vector<char> a, b;
// ...
vector<char> c;
c.insert(c.end(), a.begin(), a.end());
c.insert(c.end(), b.begin(), b.end());
使用string
:
string a, b;
// ...
string c = a + b;