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

C++ 基于c+中的布尔向量选择向量中的对象+;,c++,c++14,stdvector,C++,C++14,Stdvector,我有一个布尔向量(例如真、真、假、假)和另一个大小相同但类型不同的向量。 我想要一个输出向量,第二个向量的元素对应第一个向量中的真 基本上,我试图重现Julia或R中的内容: vec = vec[to_select] 我曾试图写一个副本,但好吧,让我们说,编译器不太喜欢它。这就是我所拥有的 auto it = copy_if(vec.begin(), vec.end(), to_select.begin(), vec.begin(), [](auto& val, auto&

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

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

vec = vec[to_select]
我曾试图写一个副本,但好吧,让我们说,编译器不太喜欢它。这就是我所拥有的

  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');
}

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

向量保证了连续元素。因此,在计算保留标志序列中的偏移量时,可以通过在元素上使用指针算法来使用删除/擦除习惯用法:

#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');
}

显然,重要的是
vec
flags
的大小是相同的(更准确地说,
flags
至少与
vec
一样大)。

编译器不太喜欢它,它不喜欢什么?如果你不想创建一个新的向量,你可以使用
std::remove\u If
。然而,由于您使用不同的列表作为谓词,我不认为您可以避免使用for loopWell,长话短说,根据我得到的结果,没有匹配的3个迭代器调用。我无法复制错误,因为已达到字符的最大限制。如果不创建新向量,是否意味着您不再需要旧向量,以便可以重复使用?“编译器不太喜欢它”,它不喜欢什么?如果您不想创建新向量,可以使用
std::remove\u If
。然而,由于您使用不同的列表作为谓词,我不认为您可以避免使用for loopWell,长话短说,根据我得到的结果,没有匹配的3个迭代器调用。我无法复制错误,因为已达到字符的最大限制。如果不创建新向量,是否意味着您不再需要旧向量,因此可以重复使用?