Ответ 1
Объявление std::remove()
выглядит как
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
Обратите внимание, что последний параметр является ссылкой. Таким образом, после компиляции он эффективно передает адрес указанного элемента.
В remove(a.begin(), a.end(), a[0])
передается код, указывающий адрес 0-го элемента a
. Когда выполняется remove()
, как только обрабатывается 0-й элемент, значение, указанное ссылкой, переданной в измененной, приводит к к неожиданному результату.
Чтобы получить ожидаемый результат, сделайте копию перед вызовом std::remove()
.
int toberemoved = a[0];
a.erase(remove(a.begin(),a.end(),toberemoved),a.end());