В то время как l oop
while(nums.begin() != nums.end()){
*output++ = *nums.begin();
nums.begin() = upper_bound(nums.begin(), nums.end(), *nums.begin());
}
вы всегда используете итератор nums.begin()
в условии и в этом операторе
*output++ = *nums.begin();
, потому что это утверждение
nums.begin() = upper_bound(nums.begin(), nums.end(), *nums.begin());
не изменяет итератор, возвращаемый новым вызовом nums.begin()
.
Вам необходимо ввести переменную типа итератора перед l oop, например
auto it = nums.begin();
while( it != nums.end()){
*output++ = *it;
it = upper_bound( it, nums.end(), *it );
}
Вот демонстрационная программа
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 1, 2 };
size_t i = 0;
while ( v.begin() != v.end() )
{
v.begin() = std::upper_bound( v.begin(), v.end(), *v.begin() );
if ( ++i == 10 ) break;
}
std::cout << "i = " << i << '\n';
i = 0;
auto it = v.begin();
while ( it != v.end() )
{
it = std::upper_bound( it, v.end(), *it );
if ( ++i == 10 ) break;
}
std::cout << "i = " << i << '\n';
return 0;
}
Ее вывод
i = 10
i = 2
Для удаления дубликатов после l oop используйте функцию-член erase, например
nums.erase( output, nums.end() );
То же самое можно сделать с помощью стандартного алгоритма std::unique
. Например
nums.erase( std::unique( nums.begin(), nums.end() ), nums.end() );