STL 中 remove 的運用

2021-06-07 13:07:59 字數 1277 閱讀 1920

—— by a code rabbit

今天在看別人的解題報告時,發現這麼一行**。

*remove(&pack[0], &pack[strlen(pack)], ' ') = '\0'; //刪除行中的空格
頓時想起前幾天寫的乙個函式:

void filterspaces(char* expression_new, char* expression) 

pos++;

}expression_new[len] = '\0';

}

兩個函式作用相似,都是過濾空格。

但是前者運用了 stl 中的 remove( ) 函式,使得**變得簡潔、易讀,並且降低了錯誤率。

於是我頓時對remove的用法產生興趣。

檢視 stl ,看到 remove( ) 函式的作用是:

remove( first, last, value) 移除 迭代器 first 到 迭代器 last 指向的區間中,值為 value 的元素。

翻開《stl原始碼剖析》,看到 remove_copy( ) 的原始碼:

template outputiterator remove_copy(inputiterator first, inputiterator last, outputiterator result, const t& value) 

return result;

}

兩段**作用相似,實現原理相同,但是 remove_copy( ) 更加高效、簡潔、實用。

而 remove 函式原始碼如下:

template forwarditerator remove(forwarditerator first, forwarditerator last, const t& value)
可見 remove( ) 對於自身開頭的不需要移動的元素直接略過,相比第乙個函式更加高效。

而需要注意的是,remove( ) 的作用是移除,而不是刪除,他不會刪除容器末尾多餘的元素。

而 remove( ) 返回了指向最後乙個元素下乙個位置的迭代器,

因此,在利用其對乙個字元陣列進行「過濾」時,可將其返回值指向的字元賦值為'\0',則可對這個字元陣列,進行正確地"過濾"。

而對於容器的「過濾」操作同理。

關於 remove( ) ,還有很多「兄弟」函式,例如 remove_copy( )等,學習對 stl 的運用,可以大大的提高**水平。

參考資料:《stl原始碼剖析》

STL中的remove問題

我將從remove的複習開始這個條款,因為remove是stl中最糊塗的演算法。誤解remove很容易,驅散所有關於remove行為的疑慮 為什麼它這麼做,它是怎麼做的 是很重要的。這是remove的宣告 templateforwarditerator remove forwarditerator ...

STL中的remove問題

我將從remove的複習開始這個條款,因為remove是stl中最糊塗的演算法。誤解remove很容易,驅散所有關於remove行為的疑慮 為什麼它這麼做,它是怎麼做的 是很重要的。這是remove的宣告 templateforwarditerator remove forwarditerator ...

STL中remove 和erase 的用法

示例 initializer listlist t vectorvec list t vector iterator it for it vec.begin it vec.end it cout endl remove vec.begin vec.end 1 for it vec.begin it ...