我有两个矢量a和b,大小相同。
vector<int> a{ 4, 3, 1, 3, 1};
vector<bool> b{false,false,true,false,true};
如果a
(同一索引)中的相同元素为真,我想删除b
中的元素。
应用函数后:a = 4,3,3
注意:我想使用std
算法或函数而不是简单的for循环。
答案 0 :(得分:6)
std::vector<int> v {1,2,3,4,5,6};
std::vector<bool> b {true, false, true, false, true, false};
v.erase(std::remove_if(v.begin(), v.end(),
[&b, &v](int const &i) { return b.at(&i - v.data()); }), v.end());
答案 1 :(得分:4)
void filter(std::vector<int>& v, const std::vector<bool>& b)
{
assert(v.size() == b.size());
auto it = b.begin();
v.erase(std::remove_if(v.begin(), v.end(), [&](int) { return *it++; }), v.end());
}
答案 2 :(得分:1)
我试图通过不使用lambdas来推动限制,只使用#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;
}
函数。我有两个解决方案但它们都需要外部存储器:
第一个解决方案
// 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;
第二个解决方案
它使用valarray代替:
Intent.FLAG_ACTIVITY_CLEAR_TOP
答案 3 :(得分:0)
没有STL算法,但修改后的版本为std::remove_if
:
template<class ForwardIt1, class ForwardIt2, class UnaryPredicate>
ForwardIt1 remove_if_tagged(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2,
UnaryPredicate p)
{
ForwardIt1 result = first1;
for (; first1 != last1; ++first1, ++first2) {
if (!p(*first1, *first2)) {
*result++ = *first1;
}
}
return result;
}
std::vector<int> a{ 4, 3, 1, 3, 1};
std::vector<bool> b{false,false,true,false,true};
a.erase(
remove_if_tagged(
a.begin(), a.end(),
b.begin(),
[](int, bool tag) { return tag; }
),
a.end()
);