删除向量元素使用向量<bool>中的条件

时间:2015-11-03 08:23:33

标签: c++ c++11

我有两个矢量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循环。

4 个答案:

答案 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());

LIVE DEMO

答案 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());
}

Demo

答案 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()
);