21

この質問は、この質問に関連していますが、まったく同じではありません。

読みやすさ関連の問題以外に、任意のバイナリデータを保持するstd::vector<char>代わりに使用することに利点はありますか?std::string

つまり、文字列と比較して、ベクトルを使用して実行する方が簡単/効率的/優れているタスクはありますか?

4

6 に答える 6

21

読みやすさ(過小評価されるべきではありません)は別として、私はstd::stringオーバーを使用することでいくつかのマイナーなパフォーマンス/メモリの問題を考えることができますstd::vector

  • 最近のstd::string実装の中には、小さな文字列の最適化を使用するものがあります。の内部バッファよりも大きいデータを格納している場合string、それは悲観的なものになり、コピー、移動、およびswap1の効率が低下し、利益がないために増加しsizeof()ます。

  • 効率的なstd::string実装では、終了ヌルを格納するために、常に現在のサイズより少なくとも1バイト多く割り当てられます(そうしないとoperator[]、対処するために追加のロジックが必要になりstr[size()]ます)。

これらの問題はどちらも非常に軽微であることを強調する必要があります。それらのパフォーマンスコストは、バックグラウンドノイズで失われる可能性が高くなります。しかし、あなたは尋ねました。


1これらの操作は、小さな文字列の最適化が使用されている場合は分岐する必要がありますが、適切な実装size()ではありません。std::vector

于 2012-07-06T09:10:04.340 に答える
1

読みやすさを超えて、そして別のメンテナがの目的を混同しないようにすることで、std::string機能に大きな違いはありません。もちろん、効率が唯一の考慮事項である場合は、char */mallocも考慮することができます。

私が考えることができる1つの潜在的な問題:

std::stringデフォルトはstoreing<char>です。後で別のタイプ(unsigned shortなど)を処理する必要がある場合は、次のいずれかを行う必要があります。

  • 独自のtypedefを作成します(これにより、通常の処理std::basic_string<unsigned short>から離れます)std::string
  • セッターにreinterpret_castロジックを暫定的に適用します。

ベクトルを使用すると、コンテナをに変更するだけで済みますstd::vector<unsigned short>

于 2012-07-06T09:19:24.953 に答える
1

はい、vector<char>確かに以上の機能がありますstring

とは異なりstring、操作中にイテレータ、参照などvector<char> を保持することが保証されていswapます。参照:小さなバッファーstd::vectorの最適化を利用できますか?

于 2012-09-26T19:53:19.430 に答える
0

それを行うことで得られる唯一の利点はstd::vector、文字の増分が簡単になることだと思いますが、それでも。を使用して行うことができますstd::string

オブジェクトのように見えてもstd::string、配列のようにアクセスできるため、文字列の特定の部分にアクセスする場合でも、std::vector

于 2012-07-06T08:50:55.983 に答える
0

理想的にはvector<unsigned char>、任意のバイナリデータを格納するために使用しますが、古い質問を参照したように、これはすでに知っていると思います。

それ以外は、文字列が終了ヌル文字を追加するため、ベクトルを使用するとメモリ効率が確実に向上します。割り当てメカニズムが両方で異なるため、パフォーマンスも向上する可能性があります-ベクトルは連続したメモリを保証します!

それに加えて、呼び出し元/ユーザーが誤って文字列メソッドの一部を呼び出す可能性があるため、文字列を使用することは正しくありません。これは災害になる可能性があります。

于 2012-07-06T09:26:13.133 に答える
0

他の回答が述べているように、ベクトルは、小さなサイズでも連続したメモリを保証し、最後に余分なヌルバイトを追加しないため、わずかに高速になる可能性があります。ただし、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;
于 2019-04-10T08:22:48.473 に答える