基于 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
显然,vec
和 flags
的大小相同很关键(更准确地说,flags
至少与 vec
一样大)。
我有一个布尔向量(例如 真、真、假、假)和另一个大小相同但类型不同的向量。 我想要一个输出向量,其中第二个向量的元素与第一个向量中的 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
显然,vec
和 flags
的大小相同很关键(更准确地说,flags
至少与 vec
一样大)。