重新划分序列容器的擦除功能

时间:2017-11-30 14:25:48

标签: c++ stl

下面的文字是有效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;
} 

它的矢量,字符串和双端队列现在给我们带来了麻烦。我们不能再使用擦除删除习惯用法,因为无法删除或删除以写入日志文件。此外,我们不能使用我们刚刚为关联容器开发的循环,因为它会为向量,字符串和deques产生未定义的行为!回想一下,对于这样的容器,调用erase不仅会使指向擦除元素的所有迭代器无效,还会使擦除元素之外的所有迭代器无效。在我们的例子中,包括i以外的所有迭代器。如果我们编写i ++,++ I或者你能想到的任何其他内容都没有关系,因为没有一个生成的迭代器是有效的。

我们必须对vector,string和deque采取不同的方法。特别是,我们必须利用擦除的返回值。返回值正是我们所需要的:它是一个有效的迭代器,一旦擦除完成就指向擦除元素后面的元素。换句话说,我们写这个:

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,字符串,deques&#34;使指向擦除元素的所有迭代器无效,它也会使擦除元素之外的所有迭代器无效&#34;,但后来的语句是矛盾的如果我们使用擦除的返回值然后我们可以使用它,问题:&#34;擦除使擦除元素之外的所有指针无效?

1 个答案:

答案 0 :(得分:2)

  

问题:“擦除是否使擦除元素之外的所有指针无效?

可能,但在这种情况下与你无关。 erase()可能使在调用erase()之前获得的现有迭代器无效,但erase()本身返回的是任何情况下新的有效迭代器。