Дано
std::vector<double> a;
std::vector<int> ind;
где ind
– это 1отсортировано по возрастанию.
Я хочу сделать эквивалент следующего:
for (auto it=ind.rbegin();it!=ind.rend();it++) a.erase(a.begin() + *it);
Я придумал это:
for (auto it=ind.begin();it!=ind.end();it++)
a[*it] = std::numeric_limits<double>::max();
std::erase(std::remove(a.begin(),a.end(),std::numeric_limits<double>::max()),a.end());
Это очень быстро, но использование std::numeric_limits::max() в качестве флага в этом контексте кажется неправильным.
Конечно, чувства не должны играть слишком большую роль в уравнении... четкое сравнение двойников в std::remove безопасно, и на практике предел никогда не будет возникать в этом векторе в рабочем приложении, так что все должно быть в порядке, нет?
Есть мысли по этому поводу?
1) Ref комментарий OP. – Альф
ind
расположены в порядке возрастания и не имеют дубликатов, но на самом деле вы не говорите об этом в своем вопросе. - person   schedule 16.02.2015std::numeric_limits<double>::infinity()
илиstd::numeric_limits<double>::quiet_NaN()
, если известно, что ни одно из значений в массивах не будет этим значением. - person tmlen   schedule 16.02.2015double a=1./0;
, тоstd::isinf(a)
оценивается как true. Насчет исключения не уверен. В моем случае я мог бы заранее проверить инфы, так как они не должны встречаться в моем контексте. Но, похоже, было бы лучше реализовать мою собственную идиому стирания-удаления, которая может использовать записи вind
, а не значения, которые идентифицируют записи для удаления. - person Jens   schedule 16.02.2015std::numeric_limits<double>::max()
уже является числом в векторе, и, следовательно, операция завершится ошибкой. В идеале я хотел бы зарезервировать специальный двойник, который я мог бы использовать в качестве флага, например, используяstd::numeric_limits<double>::max()
в качестве флага, но в то же время уменьшая максимальный двойник для всех остальных до второго по величине возможного двойное значение. - person Jens   schedule 17.02.2015