2

私のクラスでは、const static一連の文字列を保存する必要があります。現在 C++ で記述されているコードは、元の C アルゴリズム (一部) に基づいているため、データはconst char* presets[150](150 個の文字列があります) として格納されました。私は今、本質的にこれを C++ で書き直し/再パッケージ化しているので、 にchar*なりましstringた。私の質問は次のとおりです。配列をに変更する必要がありvectorますか?

この場合、どちらが良いですconst static vector<string> presetsconst static string presets[150]

4

3 に答える 3

3

確かに後者ではありません。

サイズを変更する必要がない場合は、

std::array<std::string, 150>

このようにして、 と非常によく似た方法で操作できますstd::vector

編集: 初期化で発生する可能性のある問題についてstring: 配列を C スタイルの配列として作成し、データをarray. (約)600バイトの連続ブロックをコピーするため、それほど高価な操作ではありません。

于 2013-01-07T15:41:51.983 に答える
2

実際char const* const presets[] = { ... };、文字列リテラルで初期化されましたか? つまり、あなたが と言うとき char const* presents[150]、これは誰かが 2 番目の を忘れたからなのかconst、それとも後でポインタを実際に変更したからなのかということです。そして、誰かが実際にイニシャライザを数えて中かっこに数字を入れ、イニシャライザを追加または削除するたびにこの数を更新したためですか、それともイニシャライザを少なくして初期化される末尾の値を数えたためですかnullポインタ?何をしようとしているのかを正確に把握していなければ、適切な推奨事項を提供することは困難です。

私が遭遇した最も頻繁なケースでは、すべてが const であり、配列のサイズが初期化子の数に正確に対応することが本当に必要な場合、最善の解決策はおそらくそのままにしておくことです。配列の自動サイズ設定を取得するには、C スタイルの配列を使用するか、または (C++11 のみ) を使用する必要がありますstd::vectorstd::array要素数を明示的に指定する必要があります。そして、真に静的な初期化を取得するには (したがって 、初期化の問題の順序のリスクがまったくない)、C スタイルの配列 または のいずれかが必要です(どちらのstd::array場合も ではchar const*なくstd::string、動的な初期化が必要です)。

char const*not を使用すると、std::stringアクセスするたびに (通常)、 new を作成することになることに注意してくださいstd::string。実装によっては、これにより追加のランタイム オーバーヘッドが発生する場合があります。通常、これは問題ではありませんが、考慮する必要がある場合もあります。std::string 他の静的オブジェクトのコンストラクターからオブジェクトを使用する場合、使用するとアドレスが必要な初期化の問題の順序が発生するという事実と比較検討する必要があります。

于 2013-01-07T16:13:47.997 に答える
1

場合によります。std::string の配列またはベクトルを使用する場合、実行時にオブジェクトの初期化を処理する必要があります。元の配列を使用すると、コンパイル時にすべてが初期化されます。一方、定数時間 size() などの追加機能が必要な場合は、「実際の」オブジェクトを使用すると便利な場合があります。

于 2013-01-07T16:20:03.770 に答える