C++ understanding iter and erase

C++ understanding iter and erase

本文关键字:erase and iter understanding C++      更新时间:2023-10-16

我只是在看一段代码,我必须说我还没有完全理解它。

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;
}   

我正在试着打破它:

当m_vPitchMarks的第一个元素的值小于vPitchPeriod的第一个元素的值时,执行while语句。

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

在这里,我们设置了一个类似引用的东西,指向两个向量的第一个元素(index[0]处的元素)。

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

现在我们擦除m_vPitchMarks<>中刚好有这个值的所有元素。例如,如果iter1的值为15,则m_vPitchMarks<>中所有值也为15的元素将被删除,并且向量将被缩短。

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

正确吗?谢谢你。

几乎就在你这么说的时候:

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;

似乎是一个特别低效的路径,因为从vector的前面删除一个元素需要移动剩下的每个元素。