我有一个集合,即 multiset 类型,我正在尝试使用 upper_bound 函数来查找迭代器返回的元素的索引。通常使用向量,如果我得到迭代器并从中减去 vector.begin() 以获得答案,它就可以工作。
但是,当我用一个集合尝试这个时,它会给出一个 STL 错误,说“与运算符 - 不匹配”...(省略 STL 详细信息)
这是否有一个根本原因(集合被实现为 RB-trees 和所有)。如果是这样,任何人都可以提出替代方案吗?(我正在尝试解决编程网站上的问题)
谢谢!
是的,有不同类型的迭代器,operator-
不支持非随机访问的集合迭代器。
您可以使用std::distance( mySet.begin(), iter );
我认为对于 std::set (和 multiset ),O(log N)
与向量的恒定时间和列表的线性相比,这可能是一个操作。
您确定要将数据存储在std::multiset
? 您可以改用排序向量。向量会变慢的地方是如果它被定期编辑,即你试图从任何地方插入和删除元素,同时保持其排序状态。如果数据构建一次然后多次访问,排序向量有时会更有效。
如果数据集非常大,请考虑使用std::deque
而不是std::vector
因为deque
在不需要连续内存块方面更具可扩展性。