当你有一个像:: lower这样的参数时,它在C ++中意味着什么?

时间:2014-11-18 13:23:43

标签: c++

在S.O. How to convert std::string to lower case?之类的帖子,我看过语法::something,例如

std::transform(data.begin(), data.end(), data.begin(), ::tolower);

我想知道这意味着什么。我知道std :: transform在命名空间transform中查找名为std的函数或变量。但是,当范围运算符没有第一个参数时,它意味着什么呢?

3 个答案:

答案 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

一起使用