将vector对象上的std::find_if转换为循环的最佳方法是什么?
What is the best way to convert a std::find_if on a vector to a loop?
所以我有下面的lambda函数来搜索我的字符串向量在字符串中的某个子字符串。
像一些随机字符串"water" "attic" "cat" "pool"
我想返回所有包含"at"
的字符串.
auto iter = std::find_if(myVector.begin(),
myVector.end(),
[subSequence](std::string s) -> bool { return (subSequence == s); });
if ( iter != myVector.end() ){
std::cout << *iter << "n";
}
我的问题是,把这个扩展到遍历整个向量的最好方法是什么?我是新手,我试过的所有方法都不起作用。这是否可行,或者我是否需要考虑另一种方法?
Try this:(更新以匹配更新的问题)
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> myVector = {"cat","bye","what's up?"};
std::string subString = "at";
//Create a lambda function to check if a string contains subString
//Uses s.find(subString), which returns the position of subString in s,
// and checks that it doesn't equal the end of the string
auto containsSubString = [subString](std::string s){
return s.find(subString) != std::string::npos;};
auto iter = std::find_if(myVector.begin(),
myVector.end(),
containsSubString);
//Use a while loop, checking whether iter is at the end of myVector
//Do a find_if starting at the item after iter, std::next(iter)
while (iter != myVector.end())
{
std::cout << *iter << std::endl;
iter = std::find_if(std::next(iter),
myVector.end(),
containsSubString);
}
return 0;
}
预期输出:
猫有什么事吗?
代码问题:
- 你的lambda只是比较
subSequence
和subSequence
,所以它总是返回true。 - 你正确地使用了
std::find_if
,但诀窍是把它放入while
循环中,检查你是否已经到达向量的末端。 - 虽然在lambda中包含
-> bool
没有害处,但这并不是严格必要的,因为编译器可以从lambda的定义中推断出信息(s.find(subString) != std::string::npos
总是返回bool值)。只有当类型对编译器可能有歧义时(或者如果你想让其他可能阅读你代码的程序员更清楚),你才需要显式地提到类型。
Edit:正如@Yakk的回答所看到的,实际上使用std::next(iter)
而不是iter + 1
更好,因为我最初使用它。
这是因为std::next(iter)
将适用于所有类型的c++ STL容器,而仅仅对迭代器进行自增并不适用于所有容器(尽管它适用于最常见的容器,如std::array
或std::vector
)。
把[subSequence](std::string) -> bool { return (subSequence == subSequence); }
换成[&](std::string const&str) -> bool { return (subSequence == str); }
,早上给我打电话。
如果您想要下一个元素,并且它没有返回.end()
,只需将begin子句替换为std::next(it)
,它是最后一个返回的元素。
相关文章:
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 使用虚拟变量对 std::vector 内部循环进行切片的最佳方法
- 最佳无限C++而循环与间隔
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 许多变量,没有嵌套循环的最佳方法
- C++ 结束此 8 位 for 循环的最佳方法是什么
- 用于随机访问和元素循环的最佳数据结构(C++)
- 通过回调功能,打破一个循环的最佳方法是什么?
- 确定空无限循环的编译器行为的最佳方法是什么?
- 逐行循环遍历char数组的最佳方式
- 有条件地控制 for 循环方向的最佳方法是什么
- 对于循环索引类型推导的最佳实践
- 循环中的条件,最佳实践
- 将vector对象上的std::find_if转换为循环的最佳方法是什么?
- 是否有在C++中循环"all the way through"数组的最佳实践?
- C++ - 解决头文件中模板化类循环依赖关系的最佳约定?
- OpenMP/C++:并行 for 循环,之后缩减 - 最佳实践
- 循环遍历数组并找到最接近键的数组元素的最佳方法是什么
- 从循环中连接线程:最佳实践