2012-11-22 64 views
9

该问题同时适用于std::setstd::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

获得两个迭代器之间“距离”的正确方法是['std :: distance'](http://en.cppreference.com/w/cpp/iterator/distance)函数。但是,请在使用前阅读杰克的答案。 –

回答

13

STL distance是你需要的。 std::distance(set.begin(), find_result)

请注意:

“返回第一个和最后一个元素之间的数量行为是不确定的如果最后无法到达的第一个通过(可能重复)第一递增。”

备注:复杂度是线性的;

3

std::setset::unordered_set关联容器,不序列容器,指数因此这个概念本身并没有太大的意义。

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

+0

我只需要一个“索引”来链接元素(迭代器)以便可以写入文件的方式设置项目。换句话说,我有一个庞大的集合迭代器列表,我不想将相同的冗余集合元素数据写入文件。我宁愿将唯一集合元素写入一个文件,然后将每个元素的索引写入,将它们链接回特定的设置项目。 – user974967

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); 
+0

设置时距离()函数的时间复杂度是多少?是O(1)吗? – Prince

+1

不,由于'set'只有'双向迭代器',所以'distance'必须遍历列表。如果它有'随机访问迭代器',它可能是O(1)。 – moswald