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

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

本文关键字:向量 选择 对象 布尔值 基于      更新时间:2023-10-16

i有一个布尔值的向量(例如我想要一个具有第二个向量元素在第一个向量中的对应关系的输出向量。

基本上,我正在尝试复制朱莉娅或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));

任何建议以干净,快速的方式进行,可能不创建新向量?

向量保证了连续元素。因此,在将偏移量计算为"保留标志"序列时,通过在元素上使用指针算术可以使用删除/擦除成语:

#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一样大)。