什么是非空STL擦除的安全等价物
What is a safe equivalent of non-void STL erase?
假设我有一个hash_map和一个类似的代码
// i is an iterator
i = hash_map.erase(i)
但是GCC的STL在擦除时并没有返回迭代器,而是返回了一个void。现在是一个类似的代码
hash_map.erase(i++)
安全(即不会使迭代器无效或做任何其他意外或不愉快的事情)?请注意,这是一个hash_map。
是的,这是安全的,因为在当前值被擦除之前,i
的值将被设置为下一个值。
根据SGI关于散列容器的文档,对于未擦除的元素,甚至对于调整大小,都不会发生无效(没有关于插入是否会导致调整大小的说法,所以要小心,我承认这是一种可能性)——但在后一种情况下,迭代顺序会发生变化。但这在这里不适用,除非你在遍历或其他过程中特意调整容器的大小。:-)
您可以封装擦除,为您使用的所有容器提供相同的接口:
namespace detail {
template<typename Container, typename R>
struct SelectErase {
// by default, assume the next iterator is returned
template<typename Iterator>
Iterator erase(Container& c, Iterator where) {
return c.erase(where);
}
};
// specialize on return type void
template<typename Container>
struct SelectErase<Container, void> {
template<typename Iterator>
Iterator erase(Container& c, Iterator where) {
Iterator next (where);
++next;
c.erase(where);
return next;
}
};
template<typename I, typename Container, typename R>
SelectErase<Container,R> select_erase(R (Container::*)(I)) {
return SelectErase<Container,R>();
}
} // namespace detail
template<typename Container, typename Iterator>
Iterator erase(Container& container, Iterator where) {
return detail::select_erase<Iterator>(&Container::erase).erase(container, where);
}
这需要:
- c.erase返回下一项的迭代器。这就是vector、deque和list的工作方式
- c.erase返回void,并且不会使下一个迭代器无效。这就是map、set和(非stdlib)hash_map的工作方式
我讨厌下雨,但我认为你的提议不安全。
i++是后递增运算符,这意味着i在调用擦除后递增。但是擦除会使所有指向被擦除元素的迭代器失效。所以当我被递增时,它就不再有效了。
如果你幸运的话,它可能会意外地正常工作,直到有一天它不再工作了。
据我所知,除了之外,没有其他办法
// tmp and i are both iterators
tmp = i;
++i;
hash_map.erase(tmp);
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- python集合的C++等价物是什么.计数器
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- C++中是否存在 std::conditional 的懒惰等价物?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 什么是非空STL擦除的安全等价物