std :: set中的索引或位置

时间:2009-11-25 12:03:40

标签: c++ stl

我有一个std :: set的std :: string。我需要集合中每个字符串的“索引”或“位置”,这在上下文中是一个有意义的概念吗?

我猜find()将返回字符串的迭代器,所以我的问题可能更好地表达为:“如何将迭代器转换为数字?”。

3 个答案:

答案 0 :(得分:15)

std::distance就是您所需要的。你会想要的,我猜std::distance(set.begin(), find_result)

答案 1 :(得分:1)

我不认为它是有意义的 - 集合是'自我键控'并且排序因此当修改集合时,'索引'将无效。

当然,这取决于你打算如何使用索引,以及该集合是否基本上是静态的(比如字典)。

答案 2 :(得分:1)

尽管其他人在这里写了什么,但我认为“索引”或“位置”对于集合没有意义。在数学术语中,集合只暴露其成员,也可能暴露其基数。唯一有意义的操作涉及测试项目是否是集合的成员,以及组合或减去集合以产生新集合。

有些人通过“有序”或“无序”的方面,以更宽松的术语来讨论集合作为数据结构,以及它们是否允许重复或强制执行唯一性。前一个方面使用 O(n)插入防护来区分数组,其中尝试插入项目首先扫描现有成员以查看新项目是否存在,如果不存在,则插入新项目最后,还有一个哈希表,可能仅在桶的链中保留此类订单。 std::set使用的诸如红黑树之类的树介于两者之间;它的遍历顺序相对于比较谓词强加的strict weak order是确定性的,但是,与上面描述的数组不同,它不保留插入顺序

另一个方面 - 该组是否允许重复元素 - 在数学中毫无意义,更准确地描述为 bag 。这种结构承认了身份和基于价值的“同一性”之间的区别。

你的问题可能涉及关心某些职位;目前尚不清楚该职位的含义,但我希望您需要一些与std::set分开的数据结构来正确建模。也许从您的元素集到每个位置的std::map映射都可以。这并不能保证这些职位是独一无二的。

它也可能有助于澄清问题,思考如何将其建模为 relationship ,例如在关系数据库中。什么构成关键?实体的哪些部分可以独立变化?