从 std::vector 中删除重复元素但从前面开始?

bin*_*Int 0 c++ algorithm iterator vector erase-remove-idiom

如何从向量中删除重复元素但从前面开始?

所以

2 3 4 5 2 5 会成为 3 4 2 5

1 5 3 1 会成为 5 3 1

我希望该解决方案易于阅读,如果它也具有良好的性能,那就太好了。

Vla*_*cow 5

如果容器支持双向迭代器,那么您尝试从容器的哪一侧删除重复元素并不重要,因为您可以使用反向迭代器。

这是一个演示程序。

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 
  
template <typename ForwardIterator> 
ForwardIterator remove_duplicates( ForwardIterator first, ForwardIterator last ) 
{ 
    for ( ; first != last; ++first ) 
    { 
        last = std::remove( std::next( first ), last, *first ); 
    } 
      
    return last; 
} 
  
int main() 
{ 
    std::vector<int> v = { 1, 2, 3, 4, 5, 4, 3, 2, 1 }; 
      
    for ( const auto &item : v ) std::cout << item << ' '; 
    std::cout << '\n'; 
  
    v.erase( remove_duplicates( std::begin( v ), std::end( v ) ), std::end( v ) ); 
      
    for ( const auto &item : v ) std::cout << item << ' '; 
    std::cout << '\n'; 
  
    std::cout << '\n'; 
      
    v.assign( { 1, 2, 3, 4, 5, 4, 3, 2, 1 } ); 
  
    for ( const auto &item : v ) std::cout << item << ' '; 
    std::cout << '\n'; 
      
    v.erase( std::begin( v ), remove_duplicates( std::rbegin( v ), std::rend( v ) ).base() ); 
     
    for ( const auto &item : v ) std::cout << item << ' '; 
    std::cout << '\n'; 
} 
Run Code Online (Sandbox Code Playgroud)

程序输出是

1 2 3 4 5 4 3 2 1 
1 2 3 4 5 

1 2 3 4 5 4 3 2 1 
5 4 3 2 1 
Run Code Online (Sandbox Code Playgroud)