【问题标题】:How to get unique pairs of values from a stl set如何从 stl 集中获取唯一的值对
【发布时间】:2011-04-06 19:08:06
【问题描述】:

我有一组 stl 整数,我想遍历所有唯一的整数值对,其中唯一性我认为 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 集和迭代器来实现相同的目标。我试过了:

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

但这会失败,因为迭代器没有 - 运算符。

我怎样才能做到这一点,或者我必须使用不同的容器?

【问题讨论】:

    标签: c++ stl iterator set


    【解决方案1】:

    您不需要执行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
        }
    }
    

    【讨论】:

    • 小错误:两个数字都是必需的,itr2 开始一个数字太早了。
    【解决方案2】:

    请按照以下思路进行操作:

    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 提出的建议。

    【讨论】:

    • 虽然提问者在文本中没有这样说,但他的代码表明他不想看到值相等的对。所以也许用++iter2 != myset.end();替换iter2 != myset.end(); ++iter2
    • 抱歉,我误读了您所说的内容。我确实不想要相同的值
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2019-10-20
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2019-01-03
      相关资源
      最近更新 更多