【发布时间】:2021-12-15 10:51:00
【问题描述】:
std::vector<int> v = {1,1,1,1,2,2};
auto cmp = [&v](size_t a, size_t b){return v[a] < v[b];};
std::multiset<int, decltype(cmp)> s(cmp);
Vector v 的内容只是一个例子。它可以是任何整数数组,但可以有重复值。
我使用多重集是因为我希望能够按顺序遍历所有值,并且因为 v 中的值不是唯一的。
另外,我想知道其中是否包含某个值。 例如插入后:
s.insert(1);
s.insert(1);
s.insert(2);
s.insert(2);
我希望这个测试中present 的值是false:
auto iter = s.find(3);
bool present = iter != s.end();
但是,这是真的,我想这是由于 set 的内部实现(AVL/RB-tree?)以及它如何使用比较器在内部搜索值。 虽然,我认为它应该比较最后一个值以确保它是它认为的那样。
是否有一种优雅的方式(无需额外的辅助数据结构)使其“理解”它不具有价值?
【问题讨论】:
-
比较器功能是一定有问题的。试试
auto cmp = [](int a, int b){ return a < b; };- 您不会将 indices 作为比较器函数的参数。您会在multimap中获得两个值。