一、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;
}
