—— 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 ...