Remove_If不区分大小写
Remove_If Case-Insensitive with string
有人能告诉我如何使用Remove_If与一些不区分大小写的比较?
目前我是这样做的:
template<typename T>
struct is_literal
{
enum{value = false};
};
template<>
struct is_literal<char>
{
enum{value = true};
};
template<>
struct is_literal<char*>
{
enum{value = true};
};
template<>
struct is_literal<const char*>
{
enum{value = true};
};
template<typename Char, typename Traits, typename Alloc>
struct is_literal<std::basic_string<Char, Traits, Alloc>>
{
enum{value = true};
};
template<typename T>
template<typename U>
CustomType<T>& CustomType<T>::Delete(U ValueToDelete, bool All, typename std::enable_if<is_literal<U>::value, bool>::type CaseSensitive)
{
for (std::size_t I = 0; I < TypeData.size(); ++I)
{
if (CaseSensitive ? std::string(TypeData[I]) == std::string(ValueToDelete) : std::string(ToLowerCase(TypeData[I])) == std::string(ToLowerCase(ValueToDelete)))
{
TypeData.erase(TypeData.begin() + I);
if (!All)
break;
--I;
}
}
return *this;
}
我想用remove_if做这个。或者至少有比这更好的方法…它只是看起来很丑,我决定优化代码,所以我想出了:
if (CaseSensitive)
{
if (All)
{
TypeData.erase(std::remove(TypeData.begin(), TypeData.end(), ValueToDelete), TypeData.end());
}
else
{
TypeData.erase(std::find(TypeData.begin(), TypeData.end(), ValueToDelete));
}
}
else
{
//Do I have to forloop and lowercase everything like before then compare and remove? OR can I do it just like above using std::remove or std::find with some kind of predicate for doing it?
}
任何想法?
由于remove_if
接受谓词参数,因此使用lambda应该很容易:
std::remove_if(TypeData.begin(), TypeData.end(),
[&ValueToDelete](U &val){ return ToLowerCase(val) == ToLowerCase(ValueToDelete); });
可以使用一个结构体来保存state:
struct StringEqualityPredicate {
std::string str;
bool caseSensitive;
StringEqualityPredicate(const std::string& str, bool caseSensitive = true) : str(str), caseSensitive(caseSensitive)
{ }
bool operator(const std::string& str)
{
if (caseSensitive) {
//...
} else {
//...
}
}
};
std::erase(std::remove_if(v.begin(), v.end(), StringEqualityPredicate(targetVal, caseSensitive)), v.end());
由于您使用的是c++ 11,因此可能有更紧凑、更干净的方法(例如lambda),但我的c++ 11知识基本上不存在....:)。
除了将if块移动到一个结构体中而不是在方法中内联之外,这并没有真正完成很多工作,但是如果你发现自己在多个地方这样做(或者你只是想抽象一点),这可能会很有用。
相关文章:
- 使字母检查不区分大小写
- 如何执行不区分大小写的字符串比较?
- 函数中的切换大小写语句不会切换C++
- CMake 添加不区分大小写的源文件
- 提升program_option配置文件的不区分大小写的解析
- 如何提升Perl正则表达式匹配,支持区分大小写/不区分大小写
- 对字符串向量进行排序,但不区分大小写
- 比较最后一个字符,不区分大小写(带谓词?
- 如何创建一个程序来标识最长的子字符串回文,而不考虑字母大小写
- C Visual Studio代码不使用工作区中的单个文件夹编译
- 如何在交换机中将一个枚举值标记为不适当的大小写
- 在字符串的 boost::unordered_set 中使用 Lambda 函数 - 不区分大小写
- 程序在我的C++工作区中找不到头文件
- 开关大小写不调用其中的函数
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 为什么我的代码在开关大小写中不起作用
- 比较字符串大小写不区分的简单方法是什么?
- 如何使字符串中的每个字母不区分大小写
- 不区分大小写的字符串
- Qt:如何在大小写不敏感模式下减去QString的两个QSet