谁能解释这段代码?我不明白 not1() 和 ptr_fun() 的工作原理
Can anyone explain this code? I do not understand the working of not1() and ptr_fun()
谁能解释一下这个函数的工作原理?
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()
和 ptr_fun()
的工作原理。任何人都可以为我提供这段代码的良好解释吗?
PS:我知道,这段代码删除了字符串末尾的所有空格。
问题本质上是
What is not1(ptr_fun<int, int>(isspace))
?
简答
您应该改用 std::not_fn(isspace)
,它清楚地表明它是表达“某物不是 space”的想法的“事物”。(¹)(²)
冗长的回答
这是一个谓词,它询问它的输入是否是 not a space:如果你将它应用到 'a'
你会得到 true
,如果你将它应用到 ' '
,你会得到 false
.
然而,上面一段中的 not 解释了为什么代码有 not1
的原因,但它没有说明 ptr_fun
. that 有什么用?为什么我们不能只写 not1(isspace)
?
长话短说,not1
is an old generation helper function which was deprecated in C++17 and removed in C++20。它依赖于你传递给它的参数来获得一个名为 argument_type
的成员类型,但是 isspace
是一个自由函数,而不是提供这样一个成员的 class 的对象,所以 not1(isspace)
格式错误。
ptr_fun
来拯救,因为它可以在提供 not1
期望的接口的对象中转换 isspace
。
然而,ptr_fun
was deprecated even before not1
, in C++11, and removed in C++17.
因此,底线是您不应该使用其中任何一个:您不再需要 ptr_fun
,并且您可以使用 not_fn
作为 [=17= 的更有用的替代方案].您确实可以将 not1(ptr_fun<int, int>(isspace))
更改为 std::not_fn(isspace)
,这也更像是 " is not a space".
(¹) 顺便打住using namespace std;
。 It's just the wrong thing to do.
(²) 是的,即使你必须坚持使用 C++14,也不要使用 std::not1
。在 C++14 中你已经有了通用的 lambda,所以你可以自己定义一个准 not_fn
(working example):
auto not_fn = [](auto const& pred){
return [&pred](auto const& x){
return !pred(x);
};
};
谁能解释一下这个函数的工作原理?
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()
和 ptr_fun()
的工作原理。任何人都可以为我提供这段代码的良好解释吗?
PS:我知道,这段代码删除了字符串末尾的所有空格。
问题本质上是
What is
not1(ptr_fun<int, int>(isspace))
?
简答
您应该改用 std::not_fn(isspace)
,它清楚地表明它是表达“某物不是 space”的想法的“事物”。(¹)(²)
冗长的回答
这是一个谓词,它询问它的输入是否是 not a space:如果你将它应用到 'a'
你会得到 true
,如果你将它应用到 ' '
,你会得到 false
.
然而,上面一段中的 not 解释了为什么代码有 not1
的原因,但它没有说明 ptr_fun
. that 有什么用?为什么我们不能只写 not1(isspace)
?
长话短说,not1
is an old generation helper function which was deprecated in C++17 and removed in C++20。它依赖于你传递给它的参数来获得一个名为 argument_type
的成员类型,但是 isspace
是一个自由函数,而不是提供这样一个成员的 class 的对象,所以 not1(isspace)
格式错误。
ptr_fun
来拯救,因为它可以在提供 not1
期望的接口的对象中转换 isspace
。
然而,ptr_fun
was deprecated even before not1
, in C++11, and removed in C++17.
因此,底线是您不应该使用其中任何一个:您不再需要 ptr_fun
,并且您可以使用 not_fn
作为 [=17= 的更有用的替代方案].您确实可以将 更改为 not1(ptr_fun<int, int>(isspace))
std::not_fn(isspace)
,这也更像是 " is not a space".
(¹) 顺便打住using namespace std;
。 It's just the wrong thing to do.
(²) 是的,即使你必须坚持使用 C++14,也不要使用 std::not1
。在 C++14 中你已经有了通用的 lambda,所以你可以自己定义一个准 not_fn
(working example):
auto not_fn = [](auto const& pred){
return [&pred](auto const& x){
return !pred(x);
};
};