Я попытался раздвинуть пределы, не используя лямбды, только std
функции. У меня есть два решения, но все они требуют внешней памяти:
Первое решение
#include <algorithm>
#include <iostream>
#include <iterator>
#include <tuple>
#include <utility>
#include <vector>
using namespace std;
int main(int argc, char* argv[]) {
vector<int> a{4, 3, 1, 3, 1};
vector<bool> b{true, false, true, false, true};
vector<int> c;
vector<pair<int,bool>> tmp;
// Join
transform(begin(a), end(a),
begin(b),
back_inserter(tmp),
make_pair<int const&,bool const&>);
// Filter
auto last = partition(begin(tmp), end(tmp),
(bool const&(*)(std::pair<int,bool> const&))
std::get<1,int,bool>);
// Copy back
transform(begin(tmp), last,
back_inserter(c),
(int const&(*)(pair<int,bool> const&))
get<0,int,bool>);
// Print (you could do a.swap(c) if you just want to modify 'a'
copy(begin(c), end(c), ostream_iterator<int>(cout, ", "));
cout << endl;
}
Второе решение
Он использует valarray вместо:
// 2nd solution using valarray
valarray<int> va(&a[0], a.size());
valarray<bool> vb(b.size());
copy(begin(b), end(b), begin(vb));
valarray<int> vc(va[vb]);
copy(begin(vc), end(vc), ostream_iterator<int>(cout, ", "));
cout << endl;
Что вы имеете в виду, используя 'std' вместо' for' loop? – Melebius
Использование std-алгоритмов, таких как remove, transform и т. Д. Вместо необработанного цикла. – melak47
@ melak47, точно! – user1436187