如何在 C++ 中的字符串数组中搜索字符串

how to search for a string in a string array in c++

本文关键字:字符串 数组 搜索 C++      更新时间:2023-10-16

说我有以下内容:

string myArray[] = { "adam", "aaron", "brad", "brandon" };
cout << "Please type a name: ";

我希望它,所以当用户键入"bra"并按回车键时,程序返回

brad
brandon

如果用户键入"a",程序将返回

adam
aaron

如果用户键入"adam",程序将返回

adam

我已经尝试过strstr,mystring.compare(str),mystring.compare(x,n,str) - 我找不到任何有效的方法。

处理此操作的最佳方法是什么?

这是 lambda 和 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 中,这将复制传递谓词的每个元素并将其写入我们提供的输出迭代器 - 在本例中是一个写入 std::cout 并使用 n' 作为分量计的ostream_iterator<std::string>

在没有 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;
    }
}

根据你的名字列表有多大,扫描整个事情很快就会变得非常慢。您可能需要考虑实现自己的前缀树(又名trie)。