An iterator will be invalidated by a call to erase. The erase method returns a new iterator however. The code needs to be careful not to go past the last element with the iter+1 logic. I've fixed up your code below.
I also included a more modern style from here, using remove_if and a set. It avoid some of the iterator confusion. It also works with unsorted vectors. For a very large vector, it appears slower however.
#include <vector>
#include <iostream>
#include <set>
using namespace std;
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto iter = nums.begin();
while(iter!=nums.end())
{
if((!((iter+1) == nums.end())) &&
(*iter == *(iter+1)))
{
iter = nums.erase(iter);
}
else
iter++;
}
return nums.size();
}
};
template<typename T>
size_t RemoveDuplicatesKeepOrder(std::vector<T>& vec)
{
std::set<T> seen;
auto newEnd = std::remove_if(vec.begin(), vec.end(), [&seen](const T& value)
{
if (seen.find(value) != std::end(seen))
return true;
seen.insert(value);
return false;
});
vec.erase(newEnd, vec.end());
return vec.size();
}
int main()
{
std::vector<int> v{1,1,2,2,3,4,5,5,6,6,6,6};
Solution s;
s.removeDuplicates(v);
for(auto const &element:v)
std::cout << element << std::endl;
std::vector<int> v1{1,1,2,2,3,4,5,5,6,6,6,6};
RemoveDuplicatesKeepOrder(v1);
for(auto const &element:v1)
std::cout << element << std::endl;
}