Как получить индекс элемента из предиката, переданного некоторому алгоритму STL?

Скажем, у меня есть вектор элементов и массив масок, и я хочу извлечь элементы из вектора с истинным соответствующим значением маски для разделения вектора. Есть ли способ использовать для этой цели 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++;
});

Однако это решение требует дополнительной переменной во внешнем пространстве имен, что по-прежнему нежелательно.

10
задан Mikhail 28 February 2012 в 11:51
поделиться