誰能解釋這個功能的作業原理?
string rightTrim(const string &str)
{
string s(str);
s.erase(find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(), s.end());
return s;
}
我不知道not1()and的作業原理ptr_fun()。誰能給我一個很好的解釋這個代碼?
PS:我知道,這段代碼洗掉了字串末尾的所有空格。
uj5u.com熱心網友回復:
這個問題本質上是
是什么
not1(ptr_fun<int, int>(isspace))?
簡短的回答
您應該改用std::not_fn(isspace)它,它清楚地表明它是一個“事物”,表達了“某物不是空間”的想法。(1)(2)
冗長的回答
它是一個謂詞,詢問它的輸入是否不是空格:如果你將它應用于'a'你得到true,如果你將它應用于你' ',你得到false。
但是,上一段中沒有的一個解釋了代碼具有 的原因not1,但沒有說明ptr_fun. 那是為了什么?為什么我們不能只寫not1(isspace)?
長話短說,not1這是一個老一代的輔助函式,它在 C 17 中被棄用并在 C 20 中被洗掉。它依賴于您傳遞給它的引數以具有名為的成員型別argument_type,但isspace它是一個自由函式,而不是提供此類成員的類的物件,因此not1(isspace)格式錯誤。
ptr_fun來救援,因為它可以轉換isspace為提供not1預期介面的物件。
但是,ptr_fun甚至not1在 C 11 之前就已棄用,并在 C 17 中將其洗掉。
因此,底線是您不應該使用其中任何一個:您不再需要ptr_fun,您可以將not_fn其用作not1. 您確實可以更改為not1(ptr_fun<int, int>(isspace))std::not_fn(isspace),這也更像是"is not a space"。
(1) 順便說一句,停止using namespace std;。這是錯誤的做法。
(2) 是的,即使你必須堅持使用 C 14,也不要使用std::not1. 在 C 14 中,您已經有了通用 lambda,因此您可以定義一個準not_fn自己(作業示例):
auto not_fn = [](auto const& pred){
return [&pred](auto const& x){
return !pred(x);
};
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/421511.html
標籤:
下一篇:分段錯誤二叉搜索樹
