在S.O. How to convert std::string to lower case?之类的帖子,我看过语法::something
,例如
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
我想知道这意味着什么。我知道std :: transform在命名空间transform
中查找名为std
的函数或变量。但是,当范围运算符没有第一个参数时,它意味着什么呢?
答案 0 :(得分:5)
::tolower
意味着将在全局命名空间中查找tolower
答案 1 :(得分:4)
但是当范围运算符没有第一个时,它意味着什么 参数
它表示全局命名空间。
考虑一个简单的例子。设;假设你定义了函数swap
。同时,您添加了标题<utility>
,其中还包含swap
的声明。在使用命名空间std之后dirrective;为了distinguihs他们你需要使用合格的名称。
#include <iostream>
#include <utility>
using namespace std;
void swap( int &x, int &y )
{
std::cout << "Inside ::swap" << std::endl;
int tmp = x;
x = y + 10;
y = tmp + 10;
}
int main()
{
int x = 1;
int y = 2;
std::swap( x, y );
std::cout << "x = " << x << ", y = " << y << std::endl;
x = 1;
y = 2;
::swap( x, y );
std::cout << "x = " << x << ", y = " << y << std::endl;
return 0;
}
输出
x = 2, y = 1
Inside ::swap
x = 12, y = 11
在此示例中,::swap
引用在全局命名空间中定义的函数交换,而std::swap
引用在头{{1}中的名称空间swap
中声明的标准函数std
}}
如果你要写不合格的名字
<utility>
当编译器不知道要调用哪个函数时:标准函数swap( x, y );
或您自己的函数std::swap
如果要排除指令
::swap
并写
using namepsace std;
然后编译器将调用您自己的函数swap。
现在我将解释为什么在您使用标准算法swap( x, y );
的示例中使用了std::transform
。问题是在C ++中有两个名为::tolower
的函数。其中一个是在头tolower
中声明的C标准函数,另一个是在头<cctype>
中声明的C ++函数。 C ++标准允许将C标准函数放在全局命名空间中。因此,使用名称<locale>
允许编译器选择C标准函数而不是C ++函数。
答案 2 :(得分:0)
std::transform函数迭代序列并为每个元素应用转换函数。
最后一个参数是所谓的仿函数,它可以是函数指针或实现 operator()的类的对象。 Functor是一个非常广泛应用于std lib算法部分的概念。
例如:非常有用的函数将所有字符转换为给定字符:
int testAnywhereInCppCode()
{
struct ToAnotherChar
{
char _toChar;
ToAnotherChar( char toChar):_toChar(toChar){}
char operator()(char c){ return _toChar; }
};
ToAnotherChar toAnotherCharConverter('x');
std::string data = "Hello World";
std::transform(data.begin(), data.end(), data.begin(), toAnotherCharConverter);
return 0;
}
static int testAnywhereInCppCodeCaller = testAnywhereInCppCode();
::仅表示实现std::toLower的全局命名空间。
然而,std :: toLower只是制作小写的标准方法。您可以实现自己的(例如,对于非常奇特的字符集)并将其与std :: transform
一起使用