为序列容器重新制定擦除函数
regrading erase function for sequence containers
下面的文本是有效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()
本身返回的是一个新的,有效的迭代器。
相关文章:
- 引用一个已擦除类型(void*)的指针
- 擦除while循环中迭代的元素
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- C++擦除(如果存在)
- 在映射擦除c++期间执行循环的次数
- 为什么擦除方法会影响结束方法
- C++ 字符串类擦除成员函数的时空复杂性
- 类型擦除的std::function与虚拟函数调用的开销
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- C++ 擦除函数中需要澄清
- 循环挂起迭代的 std::擦除 on std::list
- 擦除许多矢量元素,同时使用'auto'
- 如何擦除冗余输入?
- C++ STL 设置按值擦除
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 如何在写入文件时擦除最后一个逗号
- C 矢量元素擦除与新向量创建
- 为序列容器重新制定擦除函数
- 是否可以保存std::list中新插入元素的迭代器,然后使用该迭代器安全地擦除该元素?