在STL中是等价的

equivalent of this in STL

本文关键字:STL      更新时间:2023-10-16

给出以下代码

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++中等效

应该可以:

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 );

你可以这样做:

#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()来滚动自己的。

使用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);
        }
    }
}
相关文章:
  • 没有找到相关文章