std::unique實現


std::unique適用於將排過序的數據結構重復的部分全部放在結尾

但用的時候發現會將原先容器中的內容改掉,看了源碼發現這個函數會將不重復的數據結構直接覆蓋到前一個重復的位置上,下面看源碼

該函數std::unique位於頭文件<algorithm>聲明1如下:

template< class ForwardIt >  
ForwardIt unique( ForwardIt first, ForwardIt last ); 

聲明2如下:

template< class ForwardIt, class BinaryPredicate >  
ForwardIt unique( ForwardIt first, ForwardIt last, BinaryPredicate p );  

該函數的作用為: 刪除[first, last)之間所有連續重復的元素, 只保留一個。 注意, 是連續重復。 要刪除所有重復的元素, 只需要排序之后, 然后調用這個函數即可實現。 第一個版本通過==判斷是否重復, 第二個版本通過二元謂詞p判斷是否重復。 

 

二元謂詞p, 就是binary predicate which returns ​true if the elements should be treated as equal. 

版本1的可能的實現方式:

template<class ForwardIt>  
ForwardIt unique(ForwardIt first, ForwardIt last)  
{  
    if (first == last)  
        return last;  
   
    ForwardIt result = first;  
    while (++first != last) {  
        if (!(*result == *first)) {  
            *(++result) = *first;  
        }  
    }  
    return ++result;  
}  

所一, 最終返回的一個迭代器指向任務結束的位置past the end.
版本二的實現方式:

template<class ForwardIt, class BinaryPredicate>  
ForwardIt unique(ForwardIt first, ForwardIt last,   
                       BinaryPredicate p)  
{  
    if (first == last)  
        return last;  
   
    ForwardIt result = first;  
    while (++first != last) {  
        if (!p(*result, *first)) {  
            *(++result) = *first;  
        }  
    }  
    return ++result;  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM