比如说,我有元素 vector 和一个掩码数组,我想从 vector 中提取具有真实相应掩码值的元素以分离 vector 。有没有办法为此目的使用 std::copy_if
?问题是,我只有谓词内部元素的值,没有迭代器,所以我不知道地址掩码数组的实际索引。
我可以像这样直接操作地址:
vector<bool> mask;
vector<int> a, b;
copy_if(a.begin(), a.end(), b.begin(), [&] (int x) -> bool {
size_t index = &x - &a[0]; // Ugly...
return mask[index];
});
但是,我发现这是一个丑陋的解决方案。有更好的想法吗?
更新:另一种可能的解决方案是在掩码上使用外部迭代器:
vector<bool> mask;
vector<int> a, b;
auto pMask = mask.begin();
copy_if(a.begin(), a.end(), b.begin(), [&] (int x) {
return *pMask++;
});
但是,此解决方案需要在外部命名空间中添加额外的变量,这仍然是不可取的。
最佳答案
好的,经过一番调查后,我得出第一个示例是最简单的方法。但是,不要忘记通过 (const) 引用在 lambda 中传递值,以免获取参数的本地拷贝的地址:
copy_if(a.begin(), a.end(), b.begin(),
[&] (const int& x) -> bool { // <-- do not forget reference here
size_t index = &x - &a[0]; // Still ugly... but simple
return mask[index];
});
关于c++ - 如何从传递给某些 STL 算法的谓词中获取元素索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9480785/