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



我想遍历给定的整数向量,找到一个下一个上一个整数的值为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相同。

有简单的解决办法吗?

这里有两个问题。

第一个是使用循环表示法的范围,变量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 0n";
}
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 0n";
}
}

对于第二个示例,std::vector<int>::iterator经常被改变为auto以变得更短。

此范围基于循环

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

range-for循环中,i被设置为数组中每个元素的。它并没有设置为每个元素的索引,正如您目前所假设的那样。

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

#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;
}
}
}
}

最新更新