Python の itertools.combinations(input, 2) と同じことを行うために C++11 関数で遊んでいますが、これまでのところ、これは私が持っているものです:
@DavidRodríguez-dribeasによって提案されたように、EDITは外側のラムダを削除しました
#include <iostream>
#include <functional>
#include <vector>
using namespace std;
template <class T>
function<pair<T*, T*>()> combinations(vector<T> & input) {
auto it1 = input.begin();
auto end = input.end();
auto it2 = next(it1);
return [=]() mutable {
if (it2 == end) {
it1++;
it2 = next(it1);
}
if (it2 != end)
return pair<T*,T*>(&(*it1), &(*it2++));
return pair<T*,T*>(&*end, &*end);
};
};
int main (void) {
vector<int> numbers{1,2,3,4,5,6};
auto func = combinations(numbers);
while ( true ) {
auto i = func();
if (i.first == &*(numbers.end())) break;
cout << *(i.first) << ',' << *(i.second) << endl;
}
return 0;
};
組み合わせを反復するために使用される方法に満足していません。それをクリーンアップするためのアドバイスはありますか?