2

我有一个集合,即 multiset 类型,我正在尝试使用 upper_bound 函数来查找迭代器返回的元素的索引。通常使用向量,如果我得到迭代器并从中减去 vector.begin() 以获得答案,它就可以工作。
但是,当我用一个集合尝试这个时,它会给出一个 STL 错误,说“与运算符 - 不匹配”...(省略 STL 详细信息)

这是否有一个根本原因(集合被实现为 RB-trees 和所有)。如果是这样,任何人都可以提出替代方案吗?(我正在尝试解决编程网站上的问题)

谢谢!

4

1 回答 1

6

是的,有不同类型的迭代器,operator-不支持非随机访问的集合迭代器。

您可以使用std::distance( mySet.begin(), iter );

我认为对于 std::set (和 multiset ),O(log N)与向量的恒定时间和列表的线性相比,这可能是一个操作。

您确定要将数据存储在std::multiset? 您可以改用排序向量。向量会变慢的地方是如果它被定期编辑,即你试图从任何地方插入和删除元素,同时保持其排序状态。如果数据构建一次然后多次访问,排序向量有时会更有效。

如果数据集非常大,请考虑使用std::deque而不是std::vector因为deque在不需要连续内存块方面更具可扩展性。

于 2012-11-22T14:59:36.617 回答