16

「 cスタイルのstrings( )ではなくstd :: stringを常に使用する必要がありますchar *」は、ここに投稿されたほぼすべてのソースコードに対して出てくるアドバイスです。アドバイスは間違いなく良いですが、実際に取り上げられている質問では、その理由を詳しく説明することはできません。詳細なアドバイスの側面。この質問は、同じもののプレースホルダーとして機能することです。

良い答えは、次の側面をカバーする必要があります(詳細):

  1. なぜstd::stringC++でCスタイルの文字列を使用する必要があるのですか?
  2. で言及されている慣行の不利な点(もしあれば)は何#1ですか?
  3. で述べたアドバイスの反対が#1良い習慣であるシナリオは何ですか?
4

6 に答える 6

16
  1. std :: stringは独自のメモリを管理するため、それらを簡単にコピー、作成、破棄できます。
  2. 独自のバッファをstd::stringとして使用することはできません。
  3. サードパーティのCライブラリなど、バッファの所有権を取得することが期待されるものにac文字列/バッファを渡す必要があります。
于 2012-04-05T03:05:09.710 に答える
4

ええと、 charの配列だけが必要な場合、std::stringはほとんど利点を提供しません。しかし、それに直面して、それはどのくらいの頻度で起こりますか?std :: stringのような追加機能でchar配列をラップすることにより、一部の操作でパワーと効率の両方を得ることができます。

たとえば、文字の配列の長さを決定するには、配列内の文字を「カウント」する必要があります。対照的に、std :: stringは、この特定のタスクに効率的な操作を提供します。(https://stackoverflow.com/a/1467497/129622を参照)

  1. パワー、効率、健全性のために
  2. 「単なる」char配列よりも大きなメモリフットプリント
  3. 文字の配列が必要場合
于 2012-04-05T03:12:55.683 に答える
3

3)もちろん、常に使用するアドバイスstringは、常識のピンチでとらなければなりません。文字列リテラルはであり、 (たとえば)const char[]をとる関数にリテラルを渡す場合、それをで囲む意味はまったくありません。const char*std::ifstream::open()std::string

于 2012-04-05T07:54:14.833 に答える
1

char *は、基本的に文字へのポインタです。Cが行うことは、このポインターが配列の最初の文字を指すようにすることです。

std :: stringは、ベクトルによく似たクラスです。内部的には、文字の配列の格納を処理し、格納された配列を操作するためのいくつかのメンバー関数と、いくつかのオーバーロードされた演算子をユーザーに提供します。

std ::stringに対してchar*を使用する理由:

C backwards-compatibility.
Performance (potentially).
char*s have lower-level access.

char*よりもstd::stringを使用する理由:

Much more intuitive to use.
Better searching, replacement, and manipulation functions.
Reduced risk of segmentation faults.

例 :

char *は、char配列、または動的に割り当てられたchar配列と組み合わせて使用​​する必要があります。結局のところ、ポインタは実際に何かを指さない限り意味がありません。これは主にCプログラムで使用されます。

char somebuffer[100] = "a string";
char* ptr = somebuffer;  // ptr now points to somebuffer
cout << ptr; // prints "a string"
somebuffer[0] = 'b';  // change somebuffer
cout << ptr;  // prints "b string" 

'somebuffer'を変更すると、'ptr'も変更されることに注意してください。これは、この場合、somebufferが実際の文字列であるためです。ptrはそれを指す/参照するだけです。

std :: stringを使用すると、それほど奇妙ではありません。

std::string a = "a string";
std::string b = a;
cout << b;  // prints "a string"
a[0] = 'b';  // change 'a'
cout << b;  // prints "a string" (not "b string") 

ここでは、「b」が実際の文字列であるため、「a」を変更しても「b」には影響しないことがわかります。

しかし実際には、主な違いは、char配列ではメモリの管理を担当するのに対し、std::stringが管理することです。C ++では、文字列に対してchar配列を使用する理由はほとんどありません。100回のうち99回は、文字列を使用したほうがよいでしょう。

メモリ管理とポインタを完全に理解するまでは、頭痛の種を避けてstd::stringを使用してください。

于 2012-08-10T21:15:02.943 に答える
1

C++でcスタイルの文字列よりもstd::stringを使用する必要があるのはなぜですか?

主な理由は、文字列データの存続期間の管理から解放されることです。文字列を値として扱い、コンパイラ/ライブラリにメモリの管理について心配させることができます。

メモリの割り当てと有効期間を手動で管理するのは面倒で、エラーが発生しやすくなります。

#1で述べたプラクティスの不利な点(もしあれば)は何ですか?

メモリの割り当てとコピーのきめ細かい制御をあきらめます。つまり、プログラムのニーズに合わせて選択するのではなく、ツールチェーンベンダーが選択したメモリ管理戦略になってしまうということです。

注意しないと、不要なデータのコピー(refcountedされていない実装の場合)または参照カウントの操作(refcountedの実装の場合)が大量に発生する可能性があります。

混合言語プロジェクトでは、引数がstd :: stringを使用する関数、またはstd :: stringを含むデータ構造は、他の言語から直接使用することはできません。

#1で述べたアドバイスの反対が良い習慣であるシナリオは何ですか?

これについては人によって意見が異なりますが、IMO

  • 関数の引数の場合、「const char *」で文字列を渡すことは、不必要なコピー/参照を回避し、呼び出し元に渡すものについて柔軟性を与えるため、適切な選択です。
  • 他の言語との相互運用で使用されるものについては、cスタイルの文字列を使用する以外に選択肢はほとんどありません。
  • 長さの制限がわかっている場合は、固定サイズの配列を使用する方が速い場合があります。
  • 非常に長い文字列を処理する場合は、コピーするのではなく、確実にrefcountedされる構造(shared_ptrでラップされた文字配列など)を使用するか、実際にはまったく異なるタイプのデータ構造を使用する方がよい場合があります。
于 2016-07-26T13:22:52.830 に答える
-1

一般に、バグが発生しにくいため、常にstd::stringを使用する必要があります。std::stringのメモリオーバーヘッドが重要であることに注意してください。最近、std::stringオーバーヘッドについていくつかの実験を行いました。一般的には約48バイトです!記事はここにあります:http://jovislab.com/blog/?p=76

于 2012-04-13T17:35:14.023 に答える