基于 C++ 中的布尔向量选择向量中的对象

selecting objects in a vector based on a vector of booleans in c++

我有一个布尔向量(例如 真、真、假、假)和另一个大小相同但类型不同的向量。 我想要一个输出向量,其中第二个向量的元素与第一个向量中的 true 相对应。

基本上,我正在尝试重现 Julia 或 R 中的内容:

vec = vec[to_select]

我试过写一个copy_if,但是好吧,假设编译器不太喜欢它。这就是我的

  auto it = copy_if(vec.begin(), vec.end(), to_select.begin(), vec.begin(), [](auto& val, auto& cond){return cond;});

然后调整大小:

vec.resize(std::distance(vec.begin(), it));

有没有建议以干净快速的方式做到这一点,可能不创建新向量?

向量保证元素是连续的。因此,在计算保留标志序列中的偏移量时,通过对元素使用指针算法,可以在此处使用 remove/erase 习语:

#include <vector>
#include <algorithm>
int main()
{
    std::vector<int> vec = { 1,2,3,4,5,6,7,8 };
    std::vector<bool> flags = { true, true, true, false, true, false, false, true };

    vec.erase(std::remove_if(std::begin(vec), std::end(vec),
        [&](int& arg) { return !flags[&arg - vec.data()]; }), vec.end());

    for (auto x : vec)
        std::cout << x << ' ';
    std::cout.put('\n');
}

输出

1 2 3 5 8

显然,vecflags 的大小相同很关键(更准确地说,flags 至少与 vec 一样大)。