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 关键字的新实例。为了存储关键字的所有这些实例,我创建了另一个向量,但这次是关键字类型并将其称为库:

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实例只存储一个关键字,您不妨将其更改为string _Word,这样您就不需要第二个循环了。

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

并强制执行其他评论:您不应_在变量名中使用初步的 -underscore,因为它们是由实现保留的。

于 2012-08-24T17:09:03.070 回答