【问题标题】:Searching for multiple elements using std::find()使用 std::find() 搜索多个元素
【发布时间】:2016-02-15 04:30:51
【问题描述】:

是否可以使用std::find() 1 次调用来搜索多个元素?示例:std::find(vector.begin(), vector.end(), 0&&1&&D)

谢谢

【问题讨论】:

    标签: c++ vector find std


    【解决方案1】:

    您不能使用std::find。假设 0&&1&&D 是一个包含三个值的列表,并且您试图在向量中找到具有任何这些值的元素,您可以使用:

    • std::find_if 带有谓词(lambda 可能是最简单的,例如[](const T& x) { return x == 0 || x == 1 || x == d; },其中T 是您的vector 持有的任何类型),或者

    • std::find_first_of(链接页面有一个很好的例子)。

    【讨论】:

    • 不完全是,但很接近。我想做的是找出我的向量是否包含所有这些元素,即vector[0] == 1vector[1] == 0vector[2]= = D。不必在那些确切的位置,但假设一个大小为 i 的向量。同样,它们不必相邻。
    • 那么您不妨将 1、0、D 值放入第二个向量中,并在其上进行 for 循环,依次在第一个向量中为每个值调用 find .如果第二个向量比第一个小得多,它可能对缓存不太友好,但我没有理由认为您在程序的性能关键部分中有足够的数据来使其成为实际问题。如果您决定避免这种情况,您可以使用find_first_of,每次找到匹配项时,从您正在寻找的值集中删除匹配的元素,直到它为空(成功)或您点击end
    【解决方案2】:

    std::for_each 可能适合你。

    std::for_each(vector.begin(),
                  vector.end(),
                  [](auto& item) -> void {if (item == <xxx> ) { /* Use the item */ });
    

    您在评论中提问:

    这可能是一个单独的问题,但是如果存在某些元素,我可以使用一种方法在向量中搜索吗?

    std::any_of 就是这个函数。

    bool found = std::any_of(vector.begin(),
                             vector.end(),
                             [](auto& item) -> bool { return item == <xxx>; });
    

    【讨论】:

    • 能否解释一下第三个参数? [](auto item) -&gt; bool {return item == &lt;xxx&gt;l}) 是做什么的?
    • 这是一个 lambda 函数。有关详细信息,请参阅en.cppreference.com/w/cpp/language/lambda
    【解决方案3】:

    C++ Reference 说得很清楚:

    "第一个元素的迭代器在等于val的范围内。 如果没有元素匹配,函数返回last。"

    所以你不能只用一个函数调用来做到这一点。

    【讨论】:

    • 这可能是一个单独的问题,但是如果存在某些元素,我可以使用一种方法在向量中搜索吗?还是我必须递归地做?
    • 可能想检查 Tony D 的答案 :)
    【解决方案4】:

    如果您需要三个值相邻,则自己实现find() 可能是最简单和最简单的选择:

    template <class Iterator, class T>
    Iterator find_by_three_values(Iterator first, Iterator last, T value1, T value2, T value3)
    {
        for (; first != last; ++first) {
            if (*first == value1
                && first + 1 != last && *(first + 1) == value2
                && first + 2 != last && *(first + 2) == value3) {
                return first;
            }
        }
        return last;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 2020-07-27
      • 2012-05-27
      • 2014-06-15
      • 2022-06-14
      相关资源
      最近更新 更多