next_permutation比较函数

时间:2014-06-10 21:06:31

标签: c++ algorithm stl

我想使用c ++ next_permutation生成vector< pair<int,int> > v ...的所有排列,这样只有v[i].first的基础才会生成排列,而不管v[i].second的值... 示例...

v.push_back(pair<int,int>(3,600));

v.push_back(pair<int,int>(2,900));

v.push_back(pair<int,int>(2,800));

我需要遵循3个排列(处理(2,900)和(2,800)相同)。

(2,900)(2,800)(3,600)

(2,900)(3,600)(2,800)

(3,600)(2,900)(2,800)

但相反,我得到6个排列((2,900)和(2,800)正在被视为不同)

我知道必须通过在next_permutation中使用比较器函数来完成....但我无法....请帮助如何使用比较器函数......

这是代码..

int main()
{
  vector< pair<int,int> > v;

  v.push_back(pair<int,int>(3,600));
  v.push_back(pair<int,int>(2,900));
  v.push_back(pair<int,int>(2,800));

  sort(v.begin(),v.end());

  do
  {
    for(int i=0; i<v.size(); i++)
    {
      printf("%d %d   ",v[i].first,v[i].second);
    }
    printf("\n");
   }while( next_permutation(v.begin(),v.end()) );

  return 0;
}

1 个答案:

答案 0 :(得分:5)

std::next_permutation接受一个可选的比较器作为其最后一个参数。 函数定义is

template <class BidirectionalIterator, class Compare>
  bool next_permutation (BidirectionalIterator first,
                         BidirectionalIterator last, Compare comp);

您可以使用自定义比较器,仅比较该对中的第一个成员:

using namespace std;

struct compareFirstPairMember {
    bool operator()(const pair<int, int>& a, const pair<int, int>& b) const {
        return a.first < b.first;
    }
};

然后获得所有排列(在具有相同比较器的排序向量上),这是微不足道的:

int main() {

    vector<pair<int, int>> v;
    v.push_back(pair<int,int>(3,600));
    v.push_back(pair<int,int>(2,900));
    v.push_back(pair<int,int>(2,800));

    sort(v.begin(), v.end(), compareFirstPairMember());

    do {
        for(auto item : v)
          cout << item.first << " " << item.second << endl;
        cout << endl;
    } while ( std::next_permutation(begin(v), end(v), compareFirstPairMember()));

    return 0;
}

<强>输出:

  

2 900 2 800 3 600

     

2 900 3 600 2 800

     

3 600 2 800 2 900

直播示例here

修改

在C ++ 11中,您可以使用lambda:

来内联比较函数
std::next_permutation(begin(v), end(v), [](const pair<int, int>& a, const pair<int, int>& b) { return a.first < b.first; })