[英]Iterating through a vector ( C++ )
我想通過給定的整數向量 go 並找到一個 integer ,其下一個和上一個integer 的值為 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
相同。
有一個簡單的解決方法嗎?
此范圍基於 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;
}
程序 output 是
0, 1, 0
0, 2, 0
0, 3, 0
你在這里遇到了兩個問題。
第一個是使用 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
循環中, 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;
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.