在STL中相当于此

时间:2016-11-02 21:10:50

标签: c++ stl

提供以下代码

inline void inlineConvertPackFilename(char *name)
{
    while(*name)
    {
        if(*name == '\\')
        {
            *name = '/';
        }
        else
        {
            *name = (int) tolower(*name);
        }

        name++;
    }
}

问题很简单,是否存在介绍STL此功能的任何等效内容?

用法是:

static char filename[MAX_PATH + 1];
inlineConvertPackFilename(filename);

是的我知道这是一个C代码,但我想要用c ++中的等价物。

3 个答案:

答案 0 :(得分:2)

这应该有效:

inline std::string inlineConvertPackFilename(std::string name)
{
    std::transform( name.begin(), name.end(), name.begin(), []( char c ) {
        if( c == '\\' ) return '/';
        return tolower(c);
    } );
    return name;
}

用法:

auto filename = inlineConvertPackFilename( tmpFilename );

答案 1 :(得分:1)

你可以这样做:

#include <algorithm>

void convert(std::string &name)
{
  std::replace(name.begin(), name.end(), '\\', '/');

  std::transform(name.begin(), name.end(), name.begin(), ::tolower);
}

问题是std :: replace()仅适用于1:1替换(例如,用一个字符替换另一个字符)。您可以使用它,但如果您需要进行更通用的多字符子串替换,则必须使用string :: find()和string :: replace()来自行编写。

答案 2 :(得分:0)

这使用std::for_each(),因为您要求STL:

#include <string.h>
#include <string>
#include <algorithm>

void inlineConvertPackFilename(std::string& name)
{
    std::for_each(name.begin(), name.end(), [](auto& c) {
        if (c == '\\')
        {
            c = '/';
        }
        else
        {
            c = tolower(c);
        }
    });
}


int main()
{
    static std::string filename("C:\\FOO\\bar\\Baz.txt");
    inlineConvertPackFilename(filename);
    return 0;
}

但这实际上是不必要的,因为您可以改为使用范围for

void inlineConvertPackFilename(std::string& name)
{
    for (auto& c : name)
    {
        if (c == '\\')
        {
            c = '/';
        }
        else
        {
            c = tolower(c);
        }
    }
}