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