2

わかりました、この問題は一日中私を悩ませていて、解決策を見つけることができないようです. 長い投稿であることは承知していますが、ご協力いただけると幸いです。私は、.dat ファイルから読み込み、キーワードのライブラリを作成するチャットボット プログラムに取り組んでいます。オブジェクト指向のアプローチを採用して、「Keyword」というクラスを定義しました。クラス定義を以下に示します。

class Keyword
{
public:   
    //_Word holds keyword 
    vector<string> _Word;
    //_Resp holds strings of responses
    vector<string> _Resp;
    //_Antymn holds words that are the opposite to keyword
    vector<string> _Antymn;

    // Constructor
    Keyword()
    {
        // Clears members when new instance created
        _Word.clear();
        _Resp.clear();
        _Antymn.clear();
    }
};

したがって、.dat ファイルで新しいキーワードが見つかるたびに、class キーワードの新しいインスタンスを作成する必要があります。キーワードのこれらすべてのインスタンスを格納するために、別のベクトルを作成しますが、今回は Keyword 型でライブラリと呼びます。

typedef vector<Keyword> Lib;
Lib library;// this is the same as saying vector<Keyword> library

これが私が抱えている問題です: ユーザーが文字列を入力した後、その文字列にライブラリのキーワードが含まれているかどうかを確認する必要があります。つまり、_Word の文字列がユーザー入力に表示されるかどうかを確認する必要があります。あなたが持っているベクトルの階層からそれを見る:

The top level --> libary //*starting point
                 --> Keyword
                    --> _Word
                      -->"A single string" <-- I want to reference this one
                    --> _Resp
                      -->"Many strings"
                    --> _Antymn
                      -->"Many strings"

ふぅ!それが理にかなっていることを願っています。これは私が書き始めたコードです:

size_t User::findKeyword(Lib *Library)
{
    size_t found;
    int count = 0;

    for(count = 0; count<Library->size(); count++)
    {
      found = _Input.find(Library->at(count)); // this line needs to reference _Word from each keyword instance within library
      if(found!= string.npos)
        return found;
    }

    return 0;
}

「operator[]」メソッドも使用しようとしましたが、それも私が望むことをしていないようです。誰にもアイデアはありますか?もしそれができなかったら、私は非常に驚くだろう。前もって感謝します。

4

2 に答える 2

3

最初に一連の問題:

  • アンダースコアで始まり、大文字が続く識別子は、どの名前空間でも予約されています
  • コンストラクターでのclear()呼び出しKeywordは無意味であり、最適化に有害である可能性があります

なぜword_ですかvector?ひとつのキーワードだと思います。

struct Keyword
{
    // real words as identifiers, no underscores 
    //anywhere if they are public
    std::string word;
    std::vector<std::string> respones;
    std::vector<std::string> antonym;
};


typedef std::vector<Keyword> Lib;



/// finding a keyword
#include <algorithm>

Lib::iterator findKeyword(const Lib& l, const std::string& x) {
  return std::find_if(begin(l), end(l), 
                      [](const Keyword& kw) { return kw.word == x; })
  // if stuck on non C++11 compiler use a Functor
}
于 2012-08-24T17:13:29.700 に答える
2

コードを次のように変更する必要があります。

for(count = 0; count<Library->size(); count++)
{
    for(int j = 0; j < Library->at(count)._Word.size(); ++j){
        found = _Input.find(Library->at(count)._Word[j]);
                                              ^^^^^^^^^
        if(found!= string.npos)
             return found;
    }
}

メンバー変数にアクセスし、文字列のベクトルを反復処理するため。Library->at(count)クラスのオブジェクトですKeyword。私はそれ_Input.find()が引数として文字列を取ると思います。

Keywordインスタンスにキーワードが1つだけ格納されている場合は、それをに変更して、string _Word2番目のループが不要になるようにすることもできます。

for(count = 0; count<Library->size(); count++)
{
    found = _Input.find(Library->at(count)._Word);
    if(found!= string.npos)
        return found;
}

また、他のコメントを適用する_には、変数名に予備のアンダースコアを使用しないでください。これらは実装によって予約されているためです。

于 2012-08-24T17:09:03.070 に答える