【发布时间】:2018-01-10 18:23:49
【问题描述】:
所有 C++ 标准库容器都有一个insert() 方法;然而,它们并不是都有一个不带任何参数的remove() 方法,而是以任意顺序执行最便宜的删除。现在,对于不同的容器,这当然会有所不同:在向量中,我们将从后面删除,在单列表列表中,我们将从前面删除(除非我们保留指向尾部的指针),依此类推到实施细节。
那么,除了为每个容器滚动我自己的模板专业化之外,还有更惯用的方法吗?
【问题讨论】:
-
并非如此。我的意思是,默认情况下你会从 unordered_set 中删除什么? “你”是指如果你必须为标准库编写这样的标准实用程序。
-
在 C++17 中,您有用于关联容器的
extract方法,但自然需要提供要删除的元素。 -
您没有“一体化”容器。一些容器针对删除任意元素(如双端队列)进行了优化,一些针对添加元素进行了优化等。如果我们有一种廉价的方式来做 XXX,我们将只有一个容器。
-
我能看到的唯一删除“随机”元素的用例是一个一个删除所有元素,而删除顺序无关紧要。但是通常更容易遍历所有元素(
for (auto const& element: container),然后删除所有元素(container.clear())。这对于所有容器来说已经是统一的了。 -
您不需要对每个容器模板进行专门化。只是此类模板的每个共同特征。例如,地图、集合、向量、列表都可以只弹出 back() 元素。显然,队列和堆栈将弹出它们指定的任何元素。从某种意义上说,您所说的是将 say std::queue 的行为与其存储实现分离(可能不是一个坏主意)。
标签: c++ containers c++-standard-library idioms