2015-08-14 88 views
1

我只是看一個代碼,我必須說我還沒有完全理解它。C++瞭解它並刪除

vector<long>::iterator iter1; 
vector<long>::iterator iter2; 

while(m_vPitchMarks[0]<=vPitchPeriode[0]) 
{ 
    iter1 = m_vPitchMarks.begin(); 
    iter2 = vPitchPeriode.begin(); 

    m_vPitchMarks.erase(iter1); 
    vPitchPeriode.erase(iter2); 
    if((m_vPitchMarks.size()==0)||(vPitchPeriode.size()==0)) 
     break; 
} 

我試圖打破它:

在這裏,我們會做一個while語句,而m_vPitchMarks的第一個元素的值大於vPitchPeriod的第一個元素的值。

while(m_vPitchMarks[0]<=vPitchPeriode[0]) 
{ 
} 

這裏我們對兩個向量的第一個元素(索引[0]處的元素)設置了一個引用。

iter1 = m_vPitchMarks.begin(); 
iter2 = vPitchPeriode.begin(); 

現在我們從m_vPitchMarks <>中刪除所有具有此值的元素。 例如,如果iter1的值爲15,則m_vPitchMarks <>中也具有值15的所有元素都將被刪除,並且矢量將縮短。

m_vPitchMarks.erase(iter1); 
vPitchPeriode.erase(iter2); 

這是正確的嗎? 謝謝。

+1

此代碼看起來應該是對'std :: mismatch'和一對範圍''erase'調用的調用。 – chris

+1

@davmac:迭代器無論如何都不會在擦除之後使用。但是,如果任何一個容器在開始時都是空的,那麼第一次測試'while'確實是UB。從發佈的代碼中可以看出,這是否是一種可能的情況。 –

+0

@davmac擦除之後的迭代器的下一次使用並不是真的重新分配它們。 – PeterSW

回答

2

幾乎像你說:

while(m_vPitchMarks[0]<=vPitchPeriode[0]) 

將循環而m_vPitchMarks第一值小於或等於vPitchPeriode第一個值。

你這個這個代碼解釋:

iter1 = m_vPitchMarks.begin(); 
    iter2 = vPitchPeriode.begin(); 

    m_vPitchMarks.erase(iter1); 
    vPitchPeriode.erase(iter2); 

是不完全正確。它只是從兩個向量中刪除第一個值。

如果您使用的是std::dequestd::list,那麼您只需撥打pop_front即可獲得相同的結果。

然後,如果我們在外面的值的停止循環:

if((m_vPitchMarks.size()==0)||(vPitchPeriode.size()==0)) 
     break; 

似乎從矢量的前擦除元件給定一個特別低效路由需要移位每個被留下元件。

+0

因此,m_vPitchMarks.Resize(0)(或m_vPitchMarks.Clear())會執行相同的操作嗎? – tmighty

+1

@tmighty,不,'erase'調用只刪除'iter1'和'iter2'引用的元素。所有其他元素保持不變。 'resize(0)'或'clear()'會移除所有**元素。 –

+1

@tmighty,對代碼的簡短描述是「當m_vPitchMarks的第一個元素小於或等於'vPitchPeriode'的第一個元素時,從每個元素中移除第一個元素,如果兩個都不爲空,則重複」 –