为序列容器重新制定擦除函数

regrading erase function for sequence containers

本文关键字:新制定 擦除 函数      更新时间:2023-10-16

下面的文本是有效STL项目9

的摘要
ofstream logFile; // log file to write to
AssocContainer<int> c;
…
for (AssocContainer<int>::iterator i = c.begin(); // loop conditions are the
     i !=c.end();){ //same as before
     if (badValue(*i)){
         logFile << "Erasing " << *i <<'n'; // write log file
         c.erase(i++); // erase element
      }
      else ++i;
} 

现在给我们带来麻烦的是向量,字符串和Deque。我们不能再使用擦除式习惯了,因为没有办法擦除或删除来编写日志文件。此外,我们无法使用刚刚开发的循环为关联容器,因为它可以为矢量,字符串和拆卸提供不确定的行为!回想一下,对于此类容器,调用擦除不仅使所有指向删除元素的迭代器无效,还使所有迭代元素以外的迭代器无效。在我们的情况下,其中包括I之外的所有迭代器。无论我们写I , i还是您可以想到的其他任何东西都没关系,因为所产生的迭代器都没有有效。

我们必须使用矢量,弦和Deque进行不同的钉子。特别是,我们必须利用Erase的返回值。返回值正是我们所需要的:这是一个有效的迭代器,指向擦除元素后的元素,一旦完成擦除元素。换句话说,我们写这句话:

for (SeqContainer<int>::iterator i = c.beqin();
       i != c.end();){
       if (badValue(*i)){
          logFile << "Erasing " << *i << 'n';
          i = c.erase(i); // keep i valid by assigning
       } //erase's return value to it
       else ++i;
}

我的问题是作者提到,如果我们在向量,字符串和脱口机上使用擦除,"使所有指向删除元素的迭代器无效,它也会使所有迭代元素以外的所有迭代器无效",但是以后的陈述与返回值相矛盾,如果我们使用返回值然后,我们可以使用它,问题:"擦除不是无效的所有指针超出删除元素吗?

问题:"擦除不是擦除元素以外的所有指针无效吗?

可能,但是在这种情况下,它与您无关。erase()可能会在此呼叫erase()之前获得的现有迭代器无效,但是在任何情况下,erase()本身返回的是一个新的,有效的迭代器。