2013-10-31 50 views
0

我想弄清楚使用迭代器訪問矢量中位置的最佳方式。我知道迭代器的行爲像指針,所以這是我想出的唯一方法。我想知道是否有更好的或不同的方式。下面的代碼:使用迭代器訪問矢量的特定點

//This is a pointer to a vector of the class Particle BTW. vector <Particle> *particleList; 
    vector<Particle>::iterator it = particleList->begin(); 
    // I assign a specific position outside the loop to a new iterator that won't be affected 
    vector<Particle>::iterator it2 = particleList->begin() + 3; 
    for(it; it != particleList->end(); it++){ 


    it->draw(); 
    //I'm interested in the velocity of this element in particular 
    cout << it2->vel << endl; 
} 

感謝,

中號

+2

它不是唯一的方法。諸如['std :: advance'](http://en.cppreference.com/w/cpp/iterator/advance),['std :: next'](http://en.cppreference.com/w)/cpp/iterator/next)和['std :: prev'](http://en.cppreference.com/w/cpp/iterator/prev)是爲了這個特定的目的。 – WhozCraig

+0

感謝克雷格,這真棒! – mauricioSanchez

+0

他們還有一個額外的好處,就是用迭代器根據類型「ate :: advance」做正確的事情,需要一個雙向迭代器或更高版本。對於一個隨機訪問迭代器來說,它會在常量時間內跳轉,而雙向將在O(N)時間內跳轉,並且它只對給定的迭代器類型做正確的事情。養成使用它們的習慣(至少大於1)。 – WhozCraig

回答

1

請嘗試以下

for (auto i = particleList->begin(); i < particleList->begin(); ++i) { 
    i->draw(); 
    std::cout << (i+3)->vel << "\n"; 
} 

注意,沒有理由使用std::endlstd::endl具有降低性能的隱式沖水當輸出到一個日誌文件時,並且在輸出到控制檯時它已經是線緩衝了,意思是一個行結尾已經沖刷完了。

注2,你只能使用+i因爲i是一個隨機訪問迭代,因爲particleListstd::vector,如果你改變說particleListstd::list,則迭代器將是一個雙向迭代器,而不是一個隨機訪問迭代器和你將無法使用+在這種情況下,你將需要使用std::advance像WhozCraig提及,但是在副本上這樣做的,像這樣:

for (auto i = particleList->begin(); i < particleList->begin(); ++i) { 
    i->draw(); 
    auto i2 = i; 
    std::advance(i2, 3) 
    std::cout << i2->vel << "\n"; 
} 

雖然就個人而言,在這種情況下,我只想用兩個迭代器遍歷而不是std::advance因爲std::advance在時間上是線性的。這樣做:

auto i = particleList->begin(); 
auto i2 = particleList->begin(); 
std::advance(i2, 3); 
for (; i < particleList->end(); ++i, ++i2) { 
    i->draw(); 
    std::cout << i2->vel << "\n"; 
} 

注3:(i+3)i2會流失你的列表(矢量)的結束,所以做一些聰明那裏。