我想使用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;
}
答案 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; })