【发布时间】:2012-12-14 09:57:01
【问题描述】:
我正在寻找std::set 的替代品。我需要它来支持更多的操作然后std::set:
将元素从一个集合移动到另一个集合,无需“create new->copy->remove old”。
在某个位置拆分集合得到两个集合(使用
std::list splice可以获得类似的行为)设置操作(如联合),无需不必要的复制。
std::set_union会将元素从集合 A 和 B 复制到集合 C,如果我只需要集合 C 而不再需要 A 和 B,这将是低效的。
是否有任何支持这些操作的实现,或者我需要自己编写一个?
【问题讨论】:
-
你想要的不是
std::set的替代品,而是更多的算法在集合上工作。感谢完全透明的 C++ 容器和算法库的设计。您可以添加算法而无需更改数据结构。至于第一点,可以使用std::move。 -
@KonradRudolph,
set迭代器是 const 以防止您使密钥无效。如果移出的元素改变了值(这很可能),它在集合中的位置将需要改变。您需要非常小心地移动元素,然后立即通过迭代器将其擦除,这样在移动后不会检查该值 -
糟糕,我的意思是说“即使你抛弃了 const,你也需要非常小心......”
-
@JonathanWakely 好吧,我的回答中实际上暗示了“移动,然后擦除”,因为显然该元素不再有效。
-
但不仅仅是
erase(key),它必须是erase(iter),因为前者试图找到元素,并且在破坏排序不变式时搜索set将不起作用。基本上它属于未定义行为的领域