C++之remove和remove_if


 

一、Remove()函數

remove(beg,end,const T& value)  //移除區間{beg,end)中每一個“與value相等”的元素;

  remove只是通過迭代器的指針向前移動來刪除,將沒有被刪除的元素放在鏈表的前面,並返回一個指向新的超尾值的迭代器。由於remove()函數不是成員,因此不能調整鏈表的長度。remove()函數並不是真正的刪除,要想真正刪除元素則可以使用erase()或者resize()函數。用法如下:

string str1 = "Text with some   spaces";
str1.erase(std::remove(str1.begin(), str1.end(), ' '),  str1.end());  // "Textwithsomespaces"

 

函數原型: 

template< class ForwardIt, class T >
ForwardIt remove(ForwardIt first, ForwardIt last, const T& value)
{
    first = std::find(first, last, value);
    if (first != last)
        for(ForwardIt i = first; ++i != last; )
            if (!(*i == value))
                *first++ = std::move(*i);
    return first;
}

  

二、Remove_if()函數

remove_if(beg, end, op)   //移除區間[beg,end)中每一個“令判斷式:op(elem)獲得true”的元素;

  remove_if(remove和unique也是相同情況)的參數是迭代器,通過迭代器無法得到容器本身,而要刪除容器內的元素只能通過容器的成員函 數來進行,因此remove系列函數無法真正刪除元素,只能把要刪除的元素移到容器末尾並返回要被刪除元素的迭代器,然后通過erase成員函數來真正刪除。用法如下:

bool IsSpace(char x) { return x == ' '; }
string str2 = "Text with some spaces"; str2.erase(remove_if(str2.begin(), str2.end(), IsSpace), str2.end()); // "Textwithsomespaces"

 

函數原型:

template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p)
{
    first = std::find_if(first, last, p);
    if (first != last)
        for(ForwardIt i = first; ++i != last; )
            if (!p(*i))
                *first++ = std::move(*i);
    return first;
}

  


免責聲明!

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



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