Esta es la solución más válida que te podemos aportar, pero mírala pausadamente y analiza si se puede adaptar a tu proyecto.
Puede usar la aritmética de punteros para encontrar el índice de un elemento específico que std::remove_if
pasa al predicado:
std::remove_if(data.begin(), data.end(),
[&data](const double& d) return (&d - &*data.begin()) % 2); );
Tenga en cuenta que remove_if pasa el resultado de desreferenciar un iterador, y se garantiza que será un reference
según la Tabla 106 – Requerimientos de iterador en el Estándar.
De hecho, me hice una cuenta solo para esto. Usa la respuesta Awesomeyi. Es mucho más limpio.
int count = 0;
auto final = std::remove_if (data.begin(), data.end(), [&count](const double d)
return (count++) % 2;
);
El estándar dice que el predicado se aplica exactamente por última vez, por primera vez. Y remove_if funciona con ForwardIterators.
Esto implica que el predicado se aplica solo una vez en el mismo orden en que aparecen originalmente en la secuencia.
A menos, por supuesto, que la biblioteca lo esté engañando al mantener copias internas de ForwardIterator.
Recuerda algo, que puedes optar por la opción de interpretar si te fue útil.