C++ 基于c+中的布尔向量选择向量中的对象+;
我有一个布尔向量(例如真、真、假、假)和另一个大小相同但类型不同的向量。 我想要一个输出向量,第二个向量的元素对应第一个向量中的真 基本上,我试图重现Julia或R中的内容: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&
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个迭代器调用。我无法复制错误,因为已达到字符的最大限制。如果不创建新向量,是否意味着您不再需要旧向量,因此可以重复使用?