std::array
たとえばstd::array<std::string, 3>
、動的オブジェクトを使用して、コンテンツ(文字列)のサイズを変更しても安全ですか?(文字列の生のC配列を持つことは問題になる可能性があるため)
2 に答える
はい。これstd::array
は、基になるCスタイルのaray配列をラップするフレンドリーなテンプレートだからです。あなたはそれを次のようなものと考えることができます:
template <typename T, int size>
class Array {
...
T vals[size];
}
Tを上記の文字列に変更すると、文字列の配列の内容に対して実行できることはすべて、文字列ので実行できることがすぐにわかりstd::array
ます。これには、サイズ変更、削除など、想像できるあらゆるものが含まれます。
それについてさらに深く考えるために、このように考えてください。はstd::array
文字列を保持します。弦はどこに保持されているのかわかりません。配列自体が割り当てられている場合、配列は文字列に(コピーコンストラクターまたは代入を介して)それ自体のコピーを作成するように指示する場合があります。ただし、これは完全に文字列のパブリックインターフェイスを介して行われます。文字列が任意のデータ構造によって保持されているという事実は、その文字列の機能を制限するものではなく、所有者(この場合)をパブリックインターフェイスのstd::array
さらに別のクライアントにするだけです。string
のようなコンテナはstd::array
多種多様なタイプで動作する必要があるため、T
渡されるタイプについて、一般的に十分に文書化された仮定を比較的少なくする傾向があります。T
次に、これらのいくつかの仮定が有効であることを確認するのは、通常、の実装者*次第です。
*テンプレートの特殊化と呼ばれる非常に高度なトピックがあり、「文字列」などの特殊なバージョンの配列を記述できます。これらを除けばvector<bool>
、標準のコンテナでは非常にまれです。
文字列のサイズを変更することを意味すると仮定すると、そうです。