【发布时间】:2020-01-14 10:30:30
【问题描述】:
C++中有一个关联的容器,它实际上是一个集合(multiset),它可以给出一个元素在其中的顺序。
这是我使用容器的方式:
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag,
tree_order_statistics_node_update>;
问题是,我无法从中删除元素:
ordered_multiset<int> s;
s.insert(0);
s.erase(0);
cout << s.order_of_key(1); // returns number of elements less than x
// Outputs: 1
奇怪的是,如果你将less_equal 替换为less,那么你将能够毫无问题地完成这项工作,实际上如果你将容器用作多重集,那么你将无法擦除其中的元素,但是当你将它作为一个集合使用时没有问题。
- 导致问题的原因是什么?
- 我该如何解决这个问题?
注意:请不要建议使用其他容器来解决问题。这不是解决方案。
【问题讨论】:
-
为什么不使用
std::multiset? -
与其依赖
using namespace std;using namespace __gnu_pbds;,不如明确说明您正在谈论的命名空间。ordered_multiset不是 c++ 的一部分,而是一些不常见的扩展 -
我找不到
O(1)的声明来自order_of_key,但我对此非常怀疑,因为查找是O(log(n)) -
找不到文档是不使用这个库而是使用标准库的另一个原因
-
linear 还是比 unimplemented 好,比 unimplementable 好
标签: c++ stl containers libstdc++