使用两个字符串向量搜索函数

时间:2015-12-04 00:51:40

标签: c++ vector

我试图创建一个可搜索的数据库,它从用户接收5个成分作为字符串向量,然后将其与文本文件中的食谱进行比较。将文本文件转换为字符串,然后将其分解为字符串向量。当我尝试通过标记搜索成分时,它会输出每个食谱,即使搜索的项目不在食谱中。

我检查过,tokenize功能完美无缺

我还想确保循环检查每个食谱中的成分(不只是在看到它的时候停止)有关如何做的任何提示吗?

我对C ++很陌生,所以我感谢任何帮助。

void recipesearch(const vector<string>& ingredientlist) //ifstream& recipes)
{

ifstream myrecipes;
string ingredient;
string file;
vector <string> tokens;
myrecipes.open("recipes.txt");
if (myrecipes.is_open())
{
    // read entire file into string
    myrecipes.seekg(0, std::ios::end);
    file.reserve(myrecipes.tellg());
    myrecipes.seekg(0, std::ios::beg);

    file.assign((std::istreambuf_iterator<char>(myrecipes)),
        std::istreambuf_iterator<char>());

    transform(file.begin(), file.end(), file.begin(), ::tolower);//makes database lowercase         
    Tokenize(file, tokens, "#");//places recipes as seperate strings into vector


    for (const string & ingredient : ingredientlist) // each ingredient in ingredient vector
    {
        for (const string & recipe : tokens){ //each recipe in recipe vector
            if (recipe.find(ingredient) != recipe.npos) // found ingredient in file
            {
                cout << "yo";
            }
        }
    }
    }
else cout << "Unable to open recipe file!";

myrecipes.close();

}

2 个答案:

答案 0 :(得分:0)

鉴于问题陈述,设计不足。但是,你提到了C ++的新手。如果这只是为了学术目的,我会推迟这类问题,并建立起来。

您需要做的是学习将类序列化为文件并返回。如果您要对食谱及其成分进行实际的类表示,以及读取和写入文件的方法,那么这个问题的设计就会简单得多。

然后,只需通过谓词搜索配方对象集合到搜索功能即可。

我会从这里开始: http://www.parashift.com/c++-faq/serialization.html

答案 1 :(得分:0)

翻转两个for循环,以便在食谱中搜索成分。当您找到一种成分时,将其标记为找到并寻找下一种成分。只有当找到所有成分时,你才会“哟”这个食谱。

这是一种简单而愚蠢的方法:

class Recipe
{
public:
    bool requiresIngredients(const vector<string> & ingredients);
}

Christopher Pisz在他们的回答中暗示了一种更好的方法:创造一个更聪明的食谱。而不是字符串,创建一个包含字符串的类。给这个类一个搜索成分的方法。

for (const Recipe & recipe : recipes){ //each recipe in recipe vector
    if (recipe.requiresIngredients(ingredientlist))
    {
        cout << "yo"
    }
}

然后你可以

public void setTitle(String title) {
    this.title = title;
}

没有人关心Recipe如何搜索或存储其数据。当你提出更好的方法来存储和搜索其他代码时,配方永远不需要改变。