查找容器中以给定字符开头的所有单词

时间:2018-09-05 08:35:22

标签: c++ algorithm vector stl containers

我需要搜索容器中的物品的帮助。

例如:我在一个容器中有以下几句话:

crr.push_back("fred");
crr.push_back("barney");
crr.push_back("pavel");
crr.push_back("zoot");
crr.push_back("jim");
crr.push_back("peter");
crr.push_back("patrick");

我用它来查找:

const bool Contains(vector<char*>& Vec, char* Element)
{
    if (find(Vec.begin(), Vec.end(), Element) != Vec.end())
        return true;

    return false;
}

int main()
{
    if (Contains(crr, "patrick"))
    {
        system("cls");
        printf("Found\n");
    }
    else
    {
       system("cls");
       printf("Nah\n");
    }
}

它支持Found,因为在容器中找到了"patrick",但是我需要找到所有以'p'开头的单词。例如,输出可能是:

pavel
peter
patrick

我该如何实现?谢谢。

1 个答案:

答案 0 :(得分:0)

您可以将以'p'开头的所有单词复制到std::vector<std::string>容器中,然后显示其内容。这可以在线性时间运行中完成,即O(n)。空间复杂度也是线性的,因为您需要专用的向量来存储以'p'开头的每个单词。

您可以使用功能模板std::copy_if通过提供合适的谓词(例如以下lambda starts_with_p)来实现此目的:

// returns true whether the string starts with 'p', false otherwise
auto starts_with_p = [](std::string word) {
    if (word.front() == 'p')
        return true;
    return false;
};

现在,只需将std::copy_if与该谓词一起使用:

std::vector<std::string> matched_words;

std::copy_if(crr.begin(), crr.end(), 
             std::back_inserter(matched_words), starts_with_p);

向量matched_words包含原始容器中以'p'开头的所有单词。您现在可以轻松地显示它们:

for (const auto& word: matched_words)
    std::cout << word << std::endl;

如果您不希望线性空间复杂度而是一个常数O,即O(1),并且您的容器crr支持随机访问迭代器,则可以先对集合进行排序{ {1}}和std::sort函数模板,并使用std::equal_range在其上执行二进制搜索,以便获得包含以crr开头的所有单词的子范围:

'p'

但是请注意,排序的运行时间复杂度为O(n log n)。因此,通过这两个选择,您将面临运行时间与空间复杂度之间的权衡。