3

これは基本的な質問のように聞こえるかもしれません。確かに解決可能ですが、迅速でエレガントな解決策を探しています。

プログラムの予約語のコレクションを作成したい: {"apple", "orange", "peach"}

それは定数であり、実行時に文字列が予約語であるかどうかを確認できるようにしたいs(fsはセットの一部です)。

使用することを考えましstd::setたが、予約語を手動でセットに追加したくありません。さらに、新しい要素を追加したり、要素を削除したりする必要がないなど、set の全機能は必要ありません。

それを行うためのエレガントな方法は何ですか?

4

3 に答える 3

6

単語を配列に格納してから、std::set範囲コンストラクターを使用できます。

char const* raw_words[] = { "apple", "orange", "peach" };

std::set<std::string> const words(std::begin(raw_words), std::end(raw_words));

これは C++11 の new関数beginend関数を使用しますが、C++03 でも、配列の最初と最後の要素へのポインターを使用してこれを行うことができます。

C++11 では、初期化子リストを使用して を初期化することもできますがstd::set、すべてのコンパイラがこの機能をまだサポートしているわけではありません。

std::vector<std::string>また、一連の単語の内容がまったく変わらない場合は、単純に sorted withstd::lower_boundを使用std::binary_searchして要素を検索する方がよい場合もあります。これにより、パフォーマンスが向上する場合があります。

于 2012-06-09T21:46:46.267 に答える
6

最新の c++ (c++11):

const std::set<std::string> v = { "xyzzy", "plugh", "abracadabra" };
于 2012-06-09T21:49:53.590 に答える
2

予約語を手動でセットに追加したくありません。

つまり、次のようなコードが必要ないということです。

reserved_word.insert("apple");
reserved_word.insert("orange");
reserved_word.insert("peach");

他のすべての前に実行する必要がある一部の初期化コードでは、代わりに次のことを行うことができます (C++11):

const std::set<std::string> reserved_word = {"apple", "orange", "peach"};

ただし、これは実行時に初期化を実行します。

事前にソートされた を単純に使用することもできますchar const *reserved_word[] = { ... }。これにより、実行時の初期化の必要がまったくなくなります。ただし、ソース コードで正しく並べ替えを行ったほうがよいでしょう。そうしないと、並べ替えられたシーケンス検索アルゴリズムの 1 つを使用して単語を検索しようとすると、予期しない動作が発生します。

その上、セットのフルパワーは必要ありません

それがそれを避ける正当な理由だとは思いません。何かを避けるより良い理由は、禁止したいことが許可されている場合です。たとえば、実際に何かを追加したり削除したりしたくない場合は、const 以外のセットを使用することは最適なオプションではありません。ただし、代わりに const セットを使用できるため、セットを回避する必要はありません。

于 2012-06-09T21:50:50.137 に答える