我需要搜索容器中的物品的帮助。
例如:我在一个容器中有以下几句话:
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
我该如何实现?谢谢。
答案 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)。因此,通过这两个选择,您将面临运行时间与空间复杂度之间的权衡。