引用类类型向量中对象的成员

时间:2012-08-24 16:55:14

标签: c++ class vector reference

好吧,伙计这个问题一直困扰着我,我似乎无法找到解决方案。我知道它很长,但我非常感谢你提供的任何帮助。 我正在开发一个聊天机器人程序,该程序从.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 []”方法,但这似乎也不是我想要的。 有谁有想法吗 ?如果不能做到,我会非常惊讶。提前谢谢。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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;
}

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