你如何在 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';
}
}
让我们仔细看看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 通过引用捕获两个变量,指向“外部”变量,needle
和 pos
,并且它在调用时接受一个参数 (const std::string& str
)。
有了 str
它会尝试找到 needle
并将结果分配给 pos
pos = str.find(needle)
然后将 pos
与 std::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) { ...
我在多个论坛页面上查找了这个问题,而不仅仅是堆栈溢出,并且尝试了 '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';
}
}
让我们仔细看看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 通过引用捕获两个变量,指向“外部”变量,needle
和 pos
,并且它在调用时接受一个参数 (const std::string& str
)。
有了 str
它会尝试找到 needle
并将结果分配给 pos
pos = str.find(needle)
然后将 pos
与 std::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) { ...