2016-07-23 49 views
2

沒有任何理由爲什麼這個效果很好提前迭代

vector<CalcToken*>* myVec; //assume this contains CalcToken 
for(vector<CalcToken *>::iterator it = myVec->begin() ; it != myVec->end() ; advance(it,1)) { 
     cout<< (*it)->toString()<< " "; 
    } 

這個心不是讓我什麼回來? (提前(它,2))

​​

我想打一個循環,應該跳過一些元素......,下面的心不是爲我工作要麼++,它++和它+ = 2。

+0

你試過** it ++嗎?並且「_以下不爲我工作」爲什麼它不工作? –

+0

它打印出一些元素,然後垃圾或它根本不工作? –

+0

@ bhuvan-venkatesh第一個印好元素,第二個完全不印。即使我之後在循環之外打印某些東西,它也不會被打印出來。FirstStep,我不知道,當我使用它時不會打印任何東西。 –

回答

2

如果矢量具有奇數個元素,則advance調用將嘗試將迭代器推進超過矢量的末尾。這是未定義的行爲。

一個解決它的方法是使用標準的advance下面的修改(我限制前進方向,以節省自己工作)[未測試的代碼]:

template<typename Iterator> 
void limited_advance(Iterator& it, Iterator end, unsigned distance, 
         std::random_access_iterator_tag) 
{ 
    if ((end - it) < distance) 
    it += distance; 
    else 
    it = end; 
} 

template<typename Iterator> 
void limited_advance(Iterator& it, Iterator end, unsigned distance, 
         ...) 
{ 
    while (it != end && distance > 0) 
    { 
    ++it; 
    --distance; 
    } 
} 

template<typename Iterator> 
void limited_advance(Iterator& it, Iterator end, unsigned distance) 
{ 
    limited_advance(it, end, distance, 
        typename std::iterator_traits<Iterator>::iterator_category()); 
} 

,然後用limited_advance(it, myVec->end(), 2)替換advance(it,2)

+0

好的,這比我的回答好。我試圖修正範圍檢查,但後來意識到這將導致形成迭代器到數組的開始和檢出。 – Xarn