此问题适用于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++;
}
我尝试使用迭代器进行算术运算,但它不起作用:
int index = mySetIterator - mySet.begin();
有没有办法使用迭代器根据它在集合中的位置来获取这样的索引值?
答案 0 :(得分:16)
STL distance就是您所需要的。 std::distance(set.begin(), find_result)
请注意:
“返回第一个和最后一个之间的元素数。行为未定义如果从第一个(可能重复地)首先递增,则无法到达。”
备注:复杂性是线性的;
答案 1 :(得分:4)
std::set
和set::unordered_set
是关联容器,而不是序列容器,因此索引的概念本身没有多大意义。< / p>
如果需要检索关联容器的索引,则应更改设计(即使没有最小或最近插入元素的概念,此类容器中的索引也会发生变化)。
答案 2 :(得分:4)
std::set
has just a bidirectional iterator
,这意味着您无法执行operator +
(或-
)尝试的操作。这些仅适用于random access iterators
,std::vector
提供。
您需要使用std::distance
来获取“索引”,并std::advance
从集合的开头移动到结尾。
auto distance = std::distance(mySet.begin(), someIterator);
auto it = mySet.begin();
std::advance(it, distance);
assert(it == someIterator);