-3

C++ で、文字列のリストの ANY の最初のインスタンスを文字列から検索する方法を知りたいです。のフルワード バージョンの一種std::string::find_first_of(): "引数で指定された文字のいずれかと一致する最初の文字を文字列から検索します"。

提供されたリスト/配列内の単語のいずれかと一致する最初の WORD を文字列から検索するものが必要です。明確にするために、文字列のインスタンスの配列を検索したくありません。配列内の何かのインスタンスについて、文字列を検索したい。

私の目標は、文を取り、リストにあるすべての単語を削除できるようにすることです。たとえば、リスト{"the" "brown", "over"}; と文を渡すと、 "the quick brown fox jumped over the lazy dog"、出力したい" quick fox jumped lazy dog". また、必要に応じて 100 語のリストを提供できるようにしたいと考えています。これを拡張可能にする必要があります。

私が考えることができる唯一の解決策は、テキストブロックのループで使用std::find(stringArray[0])し、whileその単語が見つかったインデックスを保存し、それをすべて別のforループに入れて、配列内のすべての単語に対してそれを行い、各単語のインデックスを 1 つの巨大なリストにまとめます。必要に応じて、そのリストを数値で並べ替え、最後に、そのリスト内の位置にある各単語を調べて削除します。

特に、50,000文字のすべての文を通過するために、多くの異なる文字列で何度も使用する必要があるため、私のソリューションは難しく、非常に遅いように見えるため、関数またはそれを行うためのより簡単な方法があることを本当に望んでいますテキストのブロック。より最適化されたものが優先されます。

4

2 に答える 2

1

標準関数を探す場合、文を文字列のコンテナーとして保存することを敢えてすれば、いくつかの可能性があります。

string input="Hello, world ! I whish you all \na happy new year 2016 !";
vector<string> sentence; 

stringstream sst(input);    // split the string into its pieces 
string tmp; 
while (sst>>tmp) 
    sentence.push_back(tmp); 

もちろん、現実の世界では、空白だけでなく句読点でも分割を行います。これは単なる概念実証です。

この形式になったら、次の<algorithm>形式を使用するのは簡単find_first_of()です。

vector<string> search{"We", "You", "I"}; 
auto it =  find_first_of(sentence.begin(), sentence.end(), 
                           search.begin(), search.end()); 

                           // display remaining of the sentence
copy(it , sentence.end(), ostream_iterator<string>(cout,"/"));    
cout<<endl;     

そして、ベクトルから単語を削除することは、もはや問題ではありません。演習としてお任せします。

きれいなベクトルを取得したら、文字列を再構築できます。

stringstream so;
copy(it , sentence.end(), ostream_iterator<string>(so," ")); 
string result = so.str(); 

ここにオンラインデモがあります。

ただし、このソリューションですべてのパフォーマンスの問題が解決されるわけではありません。このためには、パフォーマンスのボトルネックがどこから来ているのかをさらに分析する必要があります: オブジェクトの不要なコピーをたくさん作成していませんか? あなた自身のアルゴリズムが多くの非効率的なメモリ割り当てを引き起こしているのでしょうか? それとも本当に膨大な量のテキストですか?

さらなる作業のためのいくつかのアイデア:

  • 文中の単語へのアルファベット順のインデックスを作成します (マップ > どこで unsigned
  • トライデータ構造を検討してください(ツリーではなくトライ!!)
  • で正規表現を使用する<regex>
于 2016-01-10T02:12:12.623 に答える