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 []”方法,但这似乎也不是我想要的。 有谁有想法吗 ?如果不能做到,我会非常惊讶。提前谢谢。
答案 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;
}
并强制执行其他注释:您不应在变量名中使用初步_
- 下划线,因为它们是由实现保留的。