你如何在 C++ 中的向量中的另一个字符串中找到 string/char? [这对我行得通]

How do you find a string/char inside another string that's in a vector in C++? [that works for me]

我在多个论坛页面上查找了这个问题,而不仅仅是堆栈溢出,并且尝试了 'Check if a string contains a string in C++' post 中的许多解决方案以及其他解决方案,并尝试了几乎所有提出的解决方案,但是 none 其中似乎对我有用?我尝试了 vector[i].find(std::string2)if(strstr(s1.c_str(),s2.c_str())) {cout << " S1 Contains S2";} 以及

 std::string in = "Lorem ipsum dolor sit amet, consectetur adipiscing elit,"
                     " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
    std::string needle = "pisci";
    auto it = std::search(in.begin(), in.end(),
                   std::boyer_moore_searcher(
                       needle.begin(), needle.end()));
    if(it != in.end())
        std::cout << "The string " << needle << " found at offset "
                  << it - in.begin() << '\n';
    else
        std::cout << "The string " << needle << " not found\n";

和更多解决方案(适应我的代码),但 none 有效。我唯一没有尝试的是 std::string.contain(),但那是因为视觉工作室(2019 v.142 - 如果有帮助的话)[我正在使用的 C++ 标准语言,预览 - 最新 C++ 工作草案的功能(标准: c++latest),] 无法识别该函数 - 因为由于某种原因它无法识别更大的库。我什至尝试颠倒这两个变量,以防我将两者混淆,并在较小的变量中寻找较大的变量。

我是 C++ 的新手,所以我不擅长用这样的东西解决问题,所以请原谅我的无知。 出现问题是因为我正在寻找的是向量吗?我创建了一个包含名称的 vector <string> names = {"Andrew John", "John Doe",};,并试图将 'peer' 放入其中并找到关键字,但同样,没有任何效果。在向量中寻找东西时是否有特殊的函数可以调用?非常感谢任何帮助!

How do you find a string/char inside another string that's in a vector in C++?

如果 std::vector<std::string> 未排序,我会使用 std::find_if

示例:

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

int main() {
    // A vector with some strings:
    std::vector<std::string> vec{
        {"Lorem ipsum dolor sit amet, consectetur adipiscing elit,"
         " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"},
        {"Foo bar"}};
                     
    std::string needle = "pisci";
    size_t pos;

    // find and save position in the found string
    auto it = std::find_if(vec.begin(), vec.end(),
                           [&needle,&pos](const std::string& str) {
                               return (pos = str.find(needle)) != std::string::npos;
                           });

    if(it != vec.end()) {
        std::cout << "Found needle at position " << pos
                  << " in string\n" << *it << '\n';
    }
}

Demo


让我们仔细看看std::find_if中使用的lambda expression

[&needle,&pos](const std::string& str) {
    return (pos = str.find(needle)) != std::string::npos;
}

lambda 是匿名 class 的实例,带有 operator(),这使得它 Callable。您可以将它与下面的 struct 进行比较,它有一个名为 foo 的实例,可以调用:

struct { void operator()() { std::cout << "foo1\n"; } } foo1;   // oldschool

auto foo2 = [](){ std::cout << "foo2\n"; };                     // lambda version:

int main() {
    foo1();  // calling foo1() - prints foo1
    foo2();  // calling foo2() - prints foo2
}}

find_if中使用的lambda中还有[&needle,&pos]。这意味着构造的 lamba 将包含对这两个变量的引用,以便能够在函数内使用它们。

与普通的比较struct

    std::string s1 = "S1";
    std::string s2 = "S2";

    struct { // struct capturing a string by reference
        void operator()() { std::cout << "foo1 " + s + '\n'; }
        std::string& s;
    } foo1{s1};

    // lamda capturing by reference
    auto foo2 = [&s2]() { std::cout << "foo2 " + s2 + '\n'; };

    foo1(); // prints "foo1 S1"
    foo2(); // prints "foo2 S2"

因此,如您所见,lambda 函数和函数对象(如上面的匿名结构实例)有很多共同点。

答案中的 lambda 通过引用捕获两个变量,指向“外部”变量,needlepos,并且它在调用时接受一个参数 (const std::string& str)。

有了 str 它会尝试找到 needle 并将结果分配给 pos

pos = str.find(needle)
然后将

posstd::string::npos 进行比较。如果它是 不是 std::string::npos 找到了针并且 lambda 将 return true 这会阻止 std::find_if 函数进一步查找并且 returns 是找到的 std::string 的迭代器。作为奖励,pos 仍将设置为其分配的最新值 - 这是找到针的字符串中的位置。

您的示例代码与您的文字描述不符。您不是在搜索字符串向量,而是搜索 a 字符串。实际上,它似乎是基于CPPreference中的示例。

Found needle at position 43 in string
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua

当我尝试它时它起作用了。

这对您的搜索来说可能有点过头了,因为您只搜索了一次字符串。使用简单的 find.

可能会更好

这根本没有显示的是您希望它在一个循环中,in 替换为字符串向量中的每个值。这是一个简单的 for 循环:

for (const auto& in : myvector) { ...