ptr_fun&tolower混乱[英] ptr_fun & tolower confusion

问题描述

我想将混合大小写的字符串转换为小写字符串.我试过了
以下代码:

std::transform(mixedCaseString.begin(),mixedCaseString::end(),
mixCaseString.begin(), std::ptr_fun(tolower));

即使我包含了 cctype 和算法,我也得到了编译器(g
++ 3.3.6) 错误:

`ptr_fun(<unknown type>)''的调用没有匹配的函数

我只能通过使用"::tolower"来解决这个问题.而不是"降低".
但后来我开始用谷歌搜索.而且在我看来
这是不安全的.并且对
上的许多类型的响应感到困惑类似的话题.

谁能指点我什么是**安全(便携),不那么麻烦**
改变 std::string 大小写的方法
使用 std::transform 或任何其他算法?使用boost也是
可以接受(但我没有使用太多其他
而不是对我使用 shared_ptr 和 polymorphic_cast).

问候,
~ 搜门

推荐答案

搜门写道:
我想将混合大小写字符串转换为小写字符串.我试过了
以下代码:

std::transform(mixedCaseString.begin(),mixedCaseString::end(),
mixCaseString.begin(), std::ptr_fun(tolower));

即使我包含了 cctype 和算法,我也得到了编译器(g
++ 3.3.6) 错误:

`ptr_fun(<unknown type>)''的调用没有匹配的函数

我只能通过使用"::tolower"来解决这个问题.而不是"降低".
但后来我开始用谷歌搜索.而且在我看来
这是不安全的.并且对
上的许多类型的响应感到困惑类似的话题.

谁能指点我什么是**安全(便携),不那么麻烦**
改变 std::string 大小写的方法
使用 std::transform 或任何其他算法?使用boost也是
可以接受(但我没有使用太多其他
而不是对我使用 shared_ptr 和 polymorphic_cast).

对存档稍作修改:
#include <tr1/memory>
#include <cstdlib>
#include <语言环境>

模板<类型名称 CharT >
类 to_lower {

typedef std::ctype<CharT char_type;

std::tr1::shared_ptrchar_type const * the_type_ptr;

公开:

to_lower ( std::locale const & r_loc = std::locale() )
: the_loc_ptr (新的 std::locale (r_loc))
, the_type_ptr ( &std::use_facet< char_type >( *the_loc_ptr ) )
{}

CharT operator() (CharT chr) const {
返回 ( the_type_ptr->tolower( chr ) );
}

};
这将与 std::transform 一起使用,如下所示:

std::transform(mixedCaseString.begin(),mixedCaseString::end(),
mixCaseString.begin(),
to_lower());

您还可以从不同的语言环境初始化 to_lower.
最佳

Kai-Uwe Bux

std::transform(mixedCaseString.begin(), mixedCaseString::end(),
mixCaseString.begin(), std::ptr_fun(tolower));
是不是有语法错误——应该是一个点
冒号.

以下片段适用于 gcc 3.4.6

#include <iostream>
#include <字符串>
#include <算法>
#include <迭代器>
#include <cctype>

int main()
{
std::string str("玛丽有一只小羊");

std::transform(str.begin(), str.end(),
str.begin(),
std::ptr_fun(tolower));

std::copy (str.begin(), str.end(),
std::ostream_iterator(std::cout));
返回0;
}

7 月 4 日下午 2:55*,Amal Pillai <amal.pil...@gmail.com 写道:
std::transform(mixedCaseString.begin(),mixedCaseString::end(),
mixCaseString.begin(), std::ptr_fun(tolower));

是不是有语法错误——应该是一个点
冒号.
是的,帖子中有一个错字_here_.谢谢指点.但是在
实际代码,它是一个点.
即使那样我也得到了错误.只有 ::tolower 解决了错误.
以下片段适用于 gcc 3.4.6

#include <iostream>
#include <字符串>
#include <算法>
#include <迭代器>
#include <cctype>

int main()
{
* * std::string str("玛丽有一只小羊");

* * std::transform(str.begin(), str.end(),
* * * * * * * * * *str.begin(),
* * * * * * * * * *std::ptr_fun(tolower));

* * std::copy (str.begin(), str.end(),
std::ostream_iterator(std::cout));
** 返回 0;

}


本文地址:https://www.itbaoku.cn/post/1050726.html