簡體   English   中英

遍歷向量 ( C++ )

[英]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 迭代到末尾,您將檢查索引-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循環中, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM