c++ 组合多个 std::find & std::find 从向量中间反向开始

c++ combine multiple std::find & std::find reverse starting in the middle of the vector

我无法以最快的方式找到一些元素。

鉴于这两个向量,我想从先前给定的位置 (3) 开始搜索元素,并将它们与另一个向量进行比较。因为我知道“有效”值在我试图建立一个机制的起点附近有 99%,它有 4 个步骤:

Valid positions are: vec1[i] == 1 && vec2[i] != vec1[5]

vec1 : 1, 0, 0, 1, 0, (3), 0, 0, 0, 0, 0, 1, 0, 1
vec2 : 3, 0, 0, 3, 0, (0), 0, 0, 0, 0, 0, 3, 0, 0
1:              ^======S                           fail: vec1[5] == vec2[3]
2:                     S==================^        fail: vec1[5] == vec2[11]
3:     ^========S                                  fail: vec1[5] == vec2[0]
4:                                        S=====^  good: vec1[5] != vec2[13]

我尝试用这段代码实现:

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

int main()
{
    std::vector<int> vec1 = {1, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0, 1};
    std::vector<int> vec2 = {1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0};

    auto down1 = std::find(vec1.rbegin() + 5, vec1.rend(), 1);
    //first search down for first element
    if (down1 != vec1.rend() && vec2[5] != vec1[std::distance(down1, vec1.rend()) - 1])
    {
        std::cout << "First downsearch: '1' found and Vec2[" << std::distance(down1, vec1.rend()) - 1 << "] is not the same as Vec1[5]" << std::endl;
        // in loop I do continue; here
    }

    auto up1 = std::find(vec1.begin() + 5, vec1.end(), 1);
    if (up1 != vec1.end() && vec2[5] != up1 - vec1.begin())
    {
        std::cout << "First upsearch: '1' found and Vec2[" << up1 - vec1.begin() << "] is not the same as Vec1[5]" << std::endl;
        // in loop I do continue; here
    }

    //second search down, starting at down1 <<<--- not working
    auto down2 = std::find(down1, vec1.rend(), 1);
    if (down2 != vec1.rend() && vec2[5] != vec1[std::distance(down2, vec1.rend()) - 1])
    {
        std::cout << "Second downsearch: First '1' found and Vec2[" << std::distance(down2, vec1.rend()) - 1 << "] is not the same as Vec1[5]" << std::endl;
        // in loop I do continue; here
    }

    return 1;
}

但我认为我无法使用第一个向下迭代器进行第二次向下搜索..

注意:我要查找的元素最多可以出现两次。一次符合条件,一次不符合。

你有什么想法吗?谢谢!! :-)

现在我只使用一个 while 循环来递增地搜索下面的一个,然后向上搜索一个,向下搜索两个,向上搜索两个。我认为 std::find 会是一个更好的解决方案,因为有时值是非常远。 (1%)

首先,您的代码有点混乱,因为在您比较 vec2[5] 的情况下,但在消息中您说 Vec1[5].

其次,我不太确定你为什么使用 std::distance 而不是仅仅取消引用迭代器:

if (down1 != vec1.rend() && vec2[5] != *down1)

最后,您的最后一个 std::find 没有按预期工作,因为您从 down1 开始,它已经指向搜索值。您要从下一个元素开始搜索:

auto down2 = std::find(down1+1, vec1.rend(), 1);

但请注意,此时 down1 可能是 rend,因此您应该先检查一下。