給定一個字符串和一個字符串的矢量,刪除矢量的每個元素的最簡單方法是以給定字符串開始的字符串是什麼?如何從以給定值開始的矢量中移除元素
例如,說有vector<string> ToProcess
已填充,並且您希望刪除以`string done =「123xyz」開頭的每個元素? 只會有一場比賽。
給定一個字符串和一個字符串的矢量,刪除矢量的每個元素的最簡單方法是以給定字符串開始的字符串是什麼?如何從以給定值開始的矢量中移除元素
例如,說有vector<string> ToProcess
已填充,並且您希望刪除以`string done =「123xyz」開頭的每個元素? 只會有一場比賽。
既然你說只有一個匹配,那麼使用STL實際上有點棘手。您不需要使用std::remove_if
,而需要使用std::find_if
來找到要刪除的值,然後使用向量中的最後一個值覆蓋該值,然後使用pop_back()
。做所有這些需要一些額外的代碼行,但會爲您提供最佳的性能,否則您將無法獲得最佳性能(因爲remove_if
在找到之後不會停止,並且其他一些方法將嘗試從中間擦除,這需要移動背面一半的矢量向下)。
要使用find_if
必須先實現一個斷言這確實「startswith」的字符串,像這樣:
struct StartsWith
{
StartsWith(string prefix) : _prefix(prefix) {}
bool operator()(const string& value) { /*...*/ }
private:
string _prefix;
};
當find_if()'(和'remove_if()')獲得通過迭代的項目值的一元函數時,它應該如何工作?現在函數無法知道'done',並且不知道應該匹配什麼。 – Celeritas 2014-09-28 08:55:39
你說的對,那些函數確實帶有一元謂詞。但他們不僅僅採用一元「功能」,而且還採用「功能對象」。這意味着你實現了一個具有'bool operator()(const std :: string&str)'的類或結構來啓動比較,但是你也給了這個類一個構造函數來接受你想要開始的字符串,以及存儲相同內容的私人成員。現在你的一元函數獲得了匹配的值,但是也可以訪問(因爲它是一個成員函數)你想要找的東西。這是一個非常普遍的技術,使用'find_if'等。 – 2014-09-28 08:59:32
有趣,在這裏它聲稱'find_if()'只需要一元函數。 http://www.cplusplus.com/reference/algorithm/remove_if/ – Celeritas 2014-09-28 09:03:22
http://en.cppreference.com/w/cpp/algorithm/remove – chris 2014-09-28 06:56:11
什麼是你處理這個問題? – 2014-09-28 09:45:17
@UlrichEckhardt我無法理解你的英語。 – Celeritas 2014-09-28 10:18:32