如何从stl集中获取唯一的值对

时间:2010-09-01 12:51:24

标签: c++ stl iterator set

我有一组整数,我想遍历所有唯一的整数值对,其中唯一性我认为val1,val2和val2,val1是相同的,我应该只看到那个组合一旦

我在python中编写了这个,我使用列表的索引(簇):

for i in range(len(clusters) - 1):
    for j in range(i+1,len(clusters)):
       #Do something with clusters[i],clusters[j])

但没有索引我不知道如何使用stl set和迭代器实现相同的功能。我试过了:

for (set<int>::iterator itr = myset.begin(); itr != myset.end()-1; ++itr) {
    cout << *itr;
}

但由于迭代器没有 - 运算符,因此失败。

我如何实现这一目标,还是必须使用其他容器?

3 个答案:

答案 0 :(得分:8)

如下所示:

for(set<int>::const_iterator iter1 = myset.begin(); iter1 != myset.end(); ++iter1) {
    for(set<int>::const_iterator iter2 = iter1; ++iter2 != myset.end();) {
    {
        std::cout << *iter1 << " " << *iter2 << "\n"; 
    }
}

这会产生所有N*(N-1)/2个唯一对,其中N是集合中的整数。

顺便说一句:每当你在没有修改任何内容的情况下迭代容器时使用const_iterator,它的风格很好,可能会有更好的性能。

编辑:修改代码以反映Steve Jessop提出的建议。

答案 1 :(得分:2)

您不需要执行end() - 1,因为end()是一个迭代器,指向容器中最后一个元素后的

更正的代码是:

for (set<int>::iterator itr = myset.begin(); itr != myset.end(); ++itr) {
    for (set<int>::iterator itr2 = itr + 1; itr2 != myset.end(); ++itr2) {
        // Do whatever you want with itr and itr2
    }
}

答案 2 :(得分:-1)

将您的数据放入boost :: bimap,然后双向迭代,将结果复制到标准STL映射中,这将强制实现唯一性。