Вы сравниваете shared_ptr
объекты друг с другом. Вместо этого вам нужно сравнить адреса этих объектов. И лямбда-выражение должно принимать входной аргумент ссылка , чтобы убедиться, что он работает с адресом исходного объекта в векторе, а не с копией объекта в другом месте в памяти.
container.erase(
std::remove_if(
container.begin(), container.end(),
[&](const std::shared_ptr<someType> &s) {
return condition[ &s - &(*container.begin()) ] == 1;
}
),
container.end()
);
Демонстрационная версия
Сравните это со следующим фрагментом в принятом ответе с на вопрос , на который вы ссылались:
a.erase(remove_if(begin(a), end(a),
[b&](const myClass& d) { return b[&d - &*begin(a)].alive(); }),
end(a));
Видите сходство?
Вычитание напечатанных адресов двух допустимых элементов в контейнере из последовательной памяти, подобно std::vector
, создает смещение между двумя элементами. И когда нижний адрес предназначен для 1-го элемента контейнера, это смещение фактически совпадает с индексом более высокого адреса. Таким образом, арифметика указателей в этом примере может получить индекс лямбда-аргумента в пределах condition
(при условии, что condition
имеет по крайней мере столько же элементов, сколько container
).