2015-08-14 54 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'的第一个元素时,从每个元素中移除第一个元素,如果两个都不为空,则重复” –