C++ 获得;索引“;通过迭代器实现集合元素的迭代

C++ 获得;索引“;通过迭代器实现集合元素的迭代,c++,stl,iterator,C++,Stl,Iterator,这个问题同时适用于std::set和std::unsorted_set 我有一个迭代器指向集合中的一个元素。我想使用迭代器根据元素在集合中的位置获取元素的“索引” 例如,我的集合的索引如下所示: int index = 0; for(MySetType::iterator begin = mySet.begin(); begin != mySet.end(); begin++) { cout << "The index for this element is " <&

这个问题同时适用于
std::set
std::unsorted_set

我有一个迭代器指向集合中的一个元素。我想使用迭代器根据元素在集合中的位置获取元素的“索引”

例如,我的集合的索引如下所示:

int index = 0;

for(MySetType::iterator begin = mySet.begin(); begin != mySet.end(); begin++)
{
    cout << "The index for this element is " << index;
    index++;
}
是否有任何方法可以使用迭代器根据其在集合中的位置来获取这样的索引值?

使用,即
std::distance(set.begin(),mySetIterator)

请注意:

返回第一个和最后一个之间的元素数。行为 未定义如果无法从first by(可能)访问last 重复)先递增

注:复杂性是线性的

但是,如果输入另外满足 LegacyRandomAccessIterator,复杂性是恒定的


std::set
set::unordered\u set
是关联容器,而不是序列容器,因此索引的概念本身没有多大意义

如果需要检索关联容器的索引,则应更改设计(即使没有插入元素最少或最新的概念,此类容器中的索引也会发生更改)。

,这意味着您无法使用
操作符+
(或
-
)执行您试图执行的操作。这些仅适用于
随机访问迭代器
,如
std::vector
提供的

您需要使用
std::distance
获取“索引”,并使用
std::advance
从集合的开头移动到结尾

auto distance = std::distance(mySet.begin(), someIterator);
auto it = mySet.begin();
std::advance(it, distance);

assert(it == someIterator);

获取两个迭代器之间“距离”的正确方法是函数。但是,请在使用前阅读答案Jack。我只需要一个“索引”来链接元素(迭代器),以一种可以写入文件的方式设置项目。换句话说,我有一个庞大的集合迭代器列表,我不想将相同的冗余集合元素数据写入文件。我宁愿将唯一的集合元素写入一个文件,然后为每个元素创建一个索引,将它们链接回特定的集合项
int RankOf(棋手、常数集和棋手)
<代码>玩家。插入(新玩家)
players.erase(退休图层)
现在您如何实现一个有效的
RankOf
函数?如果是set,distance()函数的时间复杂度是多少?是否为O(1)?否,因为
集合
只有一个
双向迭代器
距离
必须遍历列表。如果它有
随机访问迭代器
,它可能是O(1)。
auto distance = std::distance(mySet.begin(), someIterator);
auto it = mySet.begin();
std::advance(it, distance);

assert(it == someIterator);