在前一个和下一个元素等于 0 的向量中查找元素
Find element in a vector with previous and next element equal to 0
我想遍历给定的整数向量并找到一个整数,其中 next 和 previous 整数的值为 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 迭代到末尾,您将检查索引 -1
和 3
,它们超出了向量的范围。
这里是用两种方式解决问题的代码,第一种使用索引,第二种使用迭代器。对于第二个,您有效地将 p
视为指向列表中当前项目的指针。我把清单加长了一点,以便提供更多案例。它输出整数 2
和 5
被零包围。
#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
我想遍历给定的整数向量并找到一个整数,其中 next 和 previous 整数的值为 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 迭代到末尾,您将检查索引 -1
和 3
,它们超出了向量的范围。
这里是用两种方式解决问题的代码,第一种使用索引,第二种使用迭代器。对于第二个,您有效地将 p
视为指向列表中当前项目的指针。我把清单加长了一点,以便提供更多案例。它输出整数 2
和 5
被零包围。
#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