有人可以告诉我如何使用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?
}
有什么想法吗?
答案 0 :(得分:4)
好吧,因为remove_if
采用了谓词参数,所以使用lambda这应该很容易:
std::remove_if(TypeData.begin(), TypeData.end(),
[&ValueToDelete](U &val){ return ToLowerCase(val) == ToLowerCase(ValueToDelete); });
答案 1 :(得分:2)
您可以使用包含状态的结构:
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块移动到结构而不是内联中之外,这还没有真正实现,但如果你发现自己在多个地方执行此操作(或者你只想稍微抽象一下) ,这可能很有用。