将vector对象上的std::find_if转换为循环的最佳方法是什么?

What is the best way to convert a std::find_if on a vector to a loop?

本文关键字:循环 最佳 方法 转换 是什么 对象 vector std find if      更新时间:2023-10-16

所以我有下面的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;
}

预期输出:


猫有什么事吗?

代码问题:

  1. 你的lambda只是比较subSequencesubSequence,所以它总是返回true。
  2. 你正确地使用了std::find_if,但诀窍是把它放入while循环中,检查你是否已经到达向量的末端。
  3. 虽然在lambda中包含-> bool没有害处,但这并不是严格必要的,因为编译器可以从lambda的定义中推断出信息(s.find(subString) != std::string::npos总是返回bool值)。只有当类型对编译器可能有歧义时(或者如果你想让其他可能阅读你代码的程序员更清楚),你才需要显式地提到类型。

Edit:正如@Yakk的回答所看到的,实际上使用std::next(iter)而不是iter + 1更好,因为我最初使用它。
这是因为std::next(iter)将适用于所有类型的c++ STL容器,而仅仅对迭代器进行自增并不适用于所有容器(尽管它适用于最常见的容器,如std::arraystd::vector)。

[subSequence](std::string) -> bool { return (subSequence == subSequence); }换成[&](std::string const&str) -> bool { return (subSequence == str); },早上给我打电话。

如果您想要下一个元素,并且它没有返回.end(),只需将begin子句替换为std::next(it),它是最后一个返回的元素。