如何检查向量中是否存在单词

时间:2019-06-05 14:01:45

标签: c++ vector find

我正在使用向量将文件的名称检索到路径中。 我只想获取某种类型的文件。这就是为什么我试图使用.find来检测文件是否具有 conllu 格式。我想找出一个字符串是否包含“ conllu”

void read_directory(const std::string& name, stringvec& v)
{
    std::string pattern(name);
    pattern.append("\\*");
    WIN32_FIND_DATA data;
    HANDLE hFind;

    if ((hFind = FindFirstFile(pattern.c_str(), &data)) != INVALID_HANDLE_VALUE) {
        while (FindNextFile(hFind, &data) != 0) {
            v.push_back(data.cFileName);
        } 
        FindClose(hFind);
    }
}
std::vector<std::string> v;
std::vector<std::string>::iterator it;
read_directory("path", v);
it = find(v.begin(), v.end(), ".conllu");
if (it != v.end())
    std::cout << "Element found in myvector: " << *it << '\n';

向量中文件名的示例:

.gitignore
CONTRIBUTING.md
el_gdt-ud-dev.conllu

2 个答案:

答案 0 :(得分:2)

如果要检查std::vector<std::string>是否包含特定的std::string,则只需执行以下操作:

bool contains(const std::string & word, const std::vector<std::string> & set)
{
    bool found(false);
    for(size_t i = 0; !found && (i < set.size()); ++i)
    {
        if(set[i] == word)
            found = true;
    }
    return found;
}

现在,如果您要检查std::string是否包含特定的“子字符串”,则更加复杂。
我这样做是这样的:

bool contains(const std::string & pattern, const std::string & str)
{
    bool found(false);

    bool ongoing(false);
    size_t cursor(0);
    for(size_t i = 0; (!pattern.empty()) && !found && (i < str.length()); ++i)
    {
        if(ongoing)
        {
            if(str[i] == pattern[0])
            {
                cursor = 1;
            }
            else if(str[i] == pattern[cursor])
            {
                if(cursor == pattern.length()-1)
                    found = true;
                else
                    ++cursor;
            }
            else
            {
                ongoing = false;
                cursor = 0;
            }
        }
        else
        {
            if(str[i] == pattern[0])
            {
                if(pattern.size() == 1)
                    found = true;
                else
                {
                    ongoing = true;
                    ++cursor;
                }
            }
        }
    }

    return found;
}

我在所有情况下都对其进行了测试,并且成功运行了。

我希望它能提供帮助。


编辑:如果没有现成的库已经实现了这种功能,我会感到非常惊讶。但是,如果我们想自己实现它,这是一种实现方法。

答案 1 :(得分:1)

您需要在向量中的每个字符串中搜索子字符串.conllu。我建议使用一个循环和std::string::find

#include <vector>
#include <string>
#include <iostream>

int main() {
    std::vector<std::string> v = { "nope", "yes.conllu", "also.conllu", "nothere" };

    for (auto& str : v) {
        if (str.find(".conllu") != std::string::npos) {
            std::cout << "Found .conllu in " << str << std::endl;
        }
    }
}