0

私はこれに苦労していて、私は何の前進もしていないところまで来ており、助けを求める時が来ました。Boostライブラリについての私の知識は、表面的なものよりもわずかに優れています。かなり大きな文字列をプログレッシブスキャンしようとしています。実際、これはstd :: stringオブジェクトに読み込まれたファイルの内容全体です(ファイルはそれほど大きくなることはなく、コマンドラインプログラムからの出力です)。

このプログラムpnputilの出力は反復的です。必要な「oemNNN.inf」ファイルを見つけるために、特定のパターンを探しています。基本的に、私のアルゴリズムは最初の「oemNNN.inf」を見つけ、そのファイルの特性を識別するために検索することです。それが私が望むものでない場合は、次へ進んでください。

コードでは、次のようになります。

std::string filesContents;
std::string::size_type index(filesContents.find_first_of("oem"));
std::string::iterator start(filesContents.begin() + index);
boost::match_results<std::string::const_iterator> matches;
while(!found) {
    if(boost::regex_search(start, filesContents.end(), matches, re))
    {
        // do important stuff with the matches
        found = true; // found is used outside of loop too
        break;
    }

    index = filesContents.find_first_of("oem", index + 1);
    if(std::string::npos == index) break;
    start = filesContents.being() + index;
}

1.47(使用しているバージョン)のBoostライブラリドキュメントのこの例を使用しています。誰かが私の使用法がこの例のものとどのように異なるかを私に説明してください(私が地図などにものを保存していないという事実を除いて)。

私の知る限り、例で使用しているのと同じタイプのイテレータを使用しています。それでも、コードをコンパイルすると、Microsoftのコンパイラは次のように通知します。オーバーロードされた関数boost::regex_searchのインスタンスが引数リストに一致しません。それでも、イテレータはBidiIteratorという名前ですが、インテリセンスは私が使用している引数を使用してこの関数を示しています。これの重要性はわかりませんが、例を考えると、BidiIteratorが何であれ、構築にはstd :: string :: iteratorが必要だと思います(おそらく悪い仮定ですが、例)。この例では、5番目の引数match_flagsが示されていますが、その引数はデフォルトで値boost::match_defaultに設定されています。したがって、それは不要なはずです。しかし、キックとニヤリのためだけに、私はその5番目の引数を追加しましたが、それでもそうではありません。仕事。引数をどのように誤用していますか?特に例を考えると。

以下は、ループアルゴリズムなしで問題を示す簡単なプログラムです。

#include <iostream>
#include <string>

#include <boost/regex.hpp>

int main() {
std::string haystack("This is a string which contains stuff I want to find");
boost::regex needle("stuff");

boost::match_results<std::string::const_iterator> what;
if(boost::regex_search(haystack.begin(), haystack.end(), what, needle, boost::match_default)) {
    std::cout << "Found some matches" << std::endl;
    std::cout << what[0].first << std::endl;
}

return 0;
}

あなたがコンパイルすることに決めたなら、私はブーストライブラリの1.47に対してコンパイルしてリンクしています。私が取り組んでいるプロジェクトはこのバージョンを広範囲に使用しており、更新することは私が決めることではありません。

助けてくれてありがとう。これは最も苛立たしいことです。

アンディ

4

1 に答える 1

2

一般に、イテレータのタイプは異なります。

std::string haystack("This is a string which contains stuff I want to find");

からの戻り値begin()end()になりますstd::string::iterator。しかし、あなたのマッチタイプは

boost::match_results<std::string::const_iterator> what;

std::string::iteratorstd::string::const_iteratorは異なるタイプです。したがって、バリアントはほとんどありません

  1. 文字列をconstとして宣言します(つまりconst std::string haystack;
  2. イテレータをconst_iterators(つまりstd::string::const_iterator begin = haystack.begin(), end = haystack.end();)として宣言し、に渡しますregex_search
  3. 使用するboost::match_results<std::string::iterator> what;
  4. C ++ 11をお持ちの場合はhaystack.cbegin()haystack.cend()

仕事の例

于 2012-08-31T18:39:48.203 に答える