是否有一个标准的算法输出一个集合的所有对组合(例如std::set
),或者对这种对组合运行一个操作并将结果写入另一个集合,如std::transform
对N中的2的组合?
目的是我们不需要自己编写双循环或递归。或者在现有库等的帮助下,尽可能减少这些工作。
明确地说,如果我们有一个集合{1,2,3},那么这对组合将是:
[1,2]
[1,3]
[2,3]
我不知道标准方法,但这里有一个简单的工作示例,我个人想不出更有效的方法:
// set up some sample data:
std::set<int> myset;
for (int i=0; i < 5; i++ )
{
myset.insert(i);
}
std::set<int>::iterator it;
std::set<int>::iterator it2;
for( it=myset.begin(); it != myset.end(); ++it) {
int a = *it;
it2 = std::set<int>::iterator(it);
it2++;
for(; it2 != myset.end(); it2++) {
int b = *it2;
std::cout << "[" << a << "," << b << "]";
}
}
生成输出:
[0,1][0,2][0,3][0,4][1,2][1,3][1,4][2,3][2,4][3,4]
当然,您需要创建两个元素(或类似的)的std::pair<>,并将它们放入一个输出集中,而不是直接将它们输出到控制台。
希望对你有帮助。
没有标准的库算法,但是很容易编写自己的类似stl的算法来做你想要的。
#include <functional>
#include <iostream>
#include <set>
#include <vector>
template <typename FwdIt, typename Fn>
void for_each_pair(FwdIt first, FwdIt last, Fn func)
{
for (; first != last; ++first) {
for (FwdIt next = first; ++next != last;) {
func(*first, *next);
}
}
}
template <typename FwdIt, typename OutIt>
OutIt copy_pairs(FwdIt first, FwdIt last, OutIt dest)
{
for (; first != last; ++first) {
for (FwdIt next = first; ++next != last;) {
*dest++ = std::make_pair(*first, *next);
}
}
return dest;
}
template <typename FwdIt, typename OutIt, typename BinOp>
OutIt transform_pairs(FwdIt first, FwdIt last, OutIt dest, BinOp op)
{
for (; first != last; ++first) {
for (FwdIt next = first; ++next != last;) {
*dest++ = op(*first, *next);
}
}
return dest;
}
int main()
{
std::set<int> seq{ 1, 2, 3 };
for_each_pair(
std::begin(seq), std::end(seq),
[](int a, int b){ std::cout << '[' << a << ',' << b << "]n"; }
);
std::vector<std::pair<int, int>> vec;
copy_pairs(std::begin(seq), std::end(seq), std::back_inserter(vec));
for (auto &pr : vec) {
std::cout << '[' << pr.first << ',' << pr.second << "]n";
}
std::vector<int> vec2;
transform_pairs(std::begin(seq), std::end(seq), std::back_inserter(vec2), std::plus<int>());
for (auto value : vec2) {
std::cout << value << 'n';
}
}