在前一个和下一个元素等于 0 的向量中查找元素

Find element in a vector with previous and next element equal to 0

我想遍历给定的整数向量并找到一个整数,其中 nextprevious 整数的值为 0 .

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> sample = { 0,3,0 };
    for (int i : sample)
    {
        if (sample[i - 1] == sample[i + 1] == 0)
        {
            cout << "hello";
        }
    }
}

但是,我不断收到“矢量下标超出范围”错误。我认为这是因为当i为0时,sample[-1]不存在,与i = 2相同。

是否有简单的解决方法?

这里有两个问题运行。

首先是使用range-for循环表示法,变量i对应数组值0、3、0,而不是它们的索引。

第二个问题是,如果您从索引 0 迭代到末尾,您将检查索引 -13,它们超出了向量的范围。

这里是用两种方式解决问题的代码,第一种使用索引,第二种使用迭代器。对于第二个,您有效地将 p 视为指向列表中当前项目的指针。我把清单加长了一点,以便提供更多案例。它输出整数 25 被零包围。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> sample = { 0, 3, 6, 0, 2, 0, 5, 0 };
    for(int i = 1; i < sample.size() - 1; i++){
        if(sample[i-1] == 0 && sample[i+1] == 0)
            cout << "integer " << sample[i] << " surrounded by 0\n";
    }

    for(std::vector<int>::iterator p = sample.begin() + 1; p != sample.end() - 1; p++){
        if(*(p-1) == 0 && *(p+1) == 0)
            cout << "integer " << *p << " surrounded by 0\n";
    }
}

第二个例子,std::vector<int>::iterator经常改成auto更短。

range-for loop 中,i 设置为数组中每个元素的 。它未设置为每个元素的 index,正如您当前假设的那样。

您需要改用基于索引的循环:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> sample = ...;
    if (sample.size() > 2)
    {
        for (size_t i = 1; i < sample.size()-1; ++i)
        {
            if (sample[i-1] == 0 && sample[i+1] == 0)
            {
                cout << sample[i] << endl;
            }
        }
    }
}

否则,请改用基于迭代器的循环:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> sample = ...;
    if (sample.size() > 2)
    {
        for (auto iter = sample.begin()+1; iter != sample.end()-1; ++iter)
        {
            if (*(iter-1) == 0 && *(iter+1) == 0)
            {
                cout << *iter << endl;
            }
        }
    }
}

这个范围基于for循环

for (int i : sample)
{
    if (sample[i - 1] == sample[i + 1] == 0)
    {
        cout << "hello";
    }
}

没有意义,因为使用了向量的值作为向量的索引。

基于范围的 for 循环不适合这样的任务。

您可以使用例如标准算法 std::adjacent_find

这是一个演示程序。

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

int main() 
{
    std::vector<int> v = { 0, 1, 0, 2, 0, 3, 0 };
    
    auto condition = []( const auto &a, const auto &b )
    {
        return a != 0 && b == 0;
    };
    
    if ( not v.empty() )
    {
        for ( auto current = std::next( std::begin( v ) ), last = std::end( v ); 
          ( current = std::adjacent_find( current, std::end( v ), condition ) ) != last;
          std::advance( current, 2 ) )
        {
            if ( *std::prev( current ) == 0 )
            {
                std::cout << *prev( current ) << ", " 
                          << *current << ", " 
                          << *std::next( current ) << '\n';
            }
        }
    }       
    
    return 0;
}

程序输出为

0, 1, 0
0, 2, 0
0, 3, 0