说我有以下内容:
string myArray[] = { "adam", "aaron", "brad", "brandon" };
cout << "Please type a name: ";
我希望它能在用户输入&#34; bra&#34;并点击进入,程序返回
brad
brandon
如果用户键入&#34; a&#34;,则程序返回
adam
aaron
如果用户键入&#34; adam&#34;,则程序返回
adam
我试过strstr,mystring.compare(str),mystring.compare(x,n,str) - 我找不到任何有效的东西。
什么功能是处理此操作的最佳方式?
答案 0 :(得分:2)
这是lambdas和std::copy_if
的好时机。假设您要查找的字符串名为to_find
:
std::copy_if(std::begin(myArray), std::end(myArray),
std::ostream_iterator<std::string>(std::cout, "\n"),
[&](const std::string& s){
return s.find(to_find) == 0;
});
具体来说,测试一些字符串a
是否包含另一个字符串b
的方法,我们可以这样做:
a.find(b) == 0
std::string::find
会返回找到b
的索引,如果找不到则会npos
。我们想要0
,因为您只需要前缀。然后我们将它包装在lambda中并将其传递给copy_if
,它将复制传递我们的谓词的每个元素并将其写入我们提供的输出迭代器 - 在这种情况下是ostream_iterator<std::string>
写入{std::cout
1}}并使用\n'
作为分隔符。
在不使用C + 11的情况下写出相同内容的内容如下:
const size_t size = sizeof(myArray) / sizeof(*myArray);
for (size_t i = 0; i < size; ++i) {
if (myArray[i].find(to_find) == 0) {
std::cout << myArray[i] << std::endl;
}
}
答案 1 :(得分:0)
根据您的名单列表的大小,扫描整个内容会很快变得非常慢。您可能希望了解如何实施自己的prefix tree (aka trie)。