Lambda式の勉強をちょっとしたので、衝動的に量化関数を実装してみた。
#include <iostream>
#include <vector>
using namespace std;
#define vi vector<int>
#define vit vector<int>::iterator
#define all(a) begin(a),end(a)
template <class T, class LAMBDA>
bool forall(T b, T e, LAMBDA l) {
int faf = 1;
for (T it = b; it != e; it++) {
if (!l(it)) {
faf = 0;
break;
}
}
return faf;
}
template <class T, class LAMBDA>
bool thereexists(T b, T e, LAMBDA l)
{
return !forall(b, e, [l](T it) {return !l(it);});
}
main()
{
vi a = {3, 6, 9, 12};
// for all it in a there exists j in [4, 5], *it can divided by j -> 0
cout <<
forall(all(a), [](vit it) {
return thereexists(4, 5, [&](int j) {
return !(*it % j);
});
})
<< endl;
cout << forall(2, 3, [&](int it) {return it > 2;}) << endl; // 0
cout << forall(3, 4, [&](int it) {return it > 2;}) << endl; // 1
cout << forall(all(a), [&](decltype(begin(a)) it) {return !(*it % 2);}) << endl; // 0
cout << forall(all(a), [&](decltype(begin(a)) it) {return !(*it % 3);}) << endl; // 1
cout << thereexists(all(a), [&](decltype(begin(a)) it) {return !(*it % 5);}) << endl; // 0
cout << thereexists(all(a), [&](decltype(begin(a)) it) {return !(*it % 12);}) << endl; // 1
}
どれくらい意味がわかりやすくなるかというと、こんな感じ。量化記号をそのまま実装できる点で、書きやすく意味が一目瞭然。
before
int flag = 0;
for (auto itj = candidacy.begin(); itj != candidacy.end(); itj++) {
if (iti == itj)
continue;
int faf = 1;
for (int h = 0; h < COLOR_NUM; h++) {
if (!((*iti)[h] >= (*itj)[h])) {
faf = 0;
break;
}
}
if (!((*iti)[8] >= (*itj)[8]))
faf = 0;
if (!faf) {
continue;
} else if (faf) {
flag = 1;
break;
}
}
if (flag)
iti = candidacy.erase(iti, iti + 1);
else
iti++;
after
if (there_exists(all(candidacy), [&](itr(candidacy) itj) { return iti != itj && (*iti)[8] >= (*itj)[8] && for_all(0, (int)COLOR_NUM, [&](int h){ return (*iti)[h] >= (*itj)[h]; });}))
iti = candidacy.erase(iti, iti + 1);
else
iti++;