我有一组整数,我想遍历所有唯一的整数值对,其中唯一性我认为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;
}
但由于迭代器没有 - 运算符,因此失败。
我如何实现这一目标,还是必须使用其他容器?
答案 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映射中,这将强制实现唯一性。