c++ - 如何从传递给某些 STL 算法的谓词中获取元素索引?

标签 c++ algorithm stl iterator predicate

比如说,我有元素 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/

相关文章:

c++ - ZeroMQ PGM Multicast 不支持来自应用层的回复处理?

php - Http 服务器使用 C++ 将数据发布到 php-cgi

c++ - 使用 QEventLoop 调用函数

c++ - std::lower_bound 中没有小情况吗?

C++ - 实现快速排序的问题

c++ - 如何将数据从 `boost::scoped_array`复制到 `std::vector`

c++ - 在 vector C++ 的矩阵中查找条目

c++ - 使用 Boost 和多线程中断进程

c++ - 我的构建二叉树解决方案有什么问题?

c++ - 带有 remove_copy_if 的 back_insert_iterator