我是stl的新手。这是我的下面的程序。
typedef pair<string, int> p;
int main(int argc, char *argv[])
{
map<string,int> st;
st.insert(p("hello",1)); //Inserted "hello" as key to map.
st.insert(p("HELLO",1)); //Inserted "HELLO" as key to map.
cout<<"size="<<st.size()<<endl; //Output is 2 because two records found "hello" and "HELLO"
return 0;
}
我不想考虑重复的案例变更(大写字母为小写字母,反之亦然)。这里“st.insert(p(”HELLO“,1));”应该失败,因此没有。记录应为“1”而不是“2”。是否有任何标志设置或类似设置?
我无法找到相关问题因此发布了这个问题。
感谢任何帮助。
答案 0 :(得分:26)
使用自定义比较器:
struct comp {
bool operator() (const std::string& lhs, const std::string& rhs) const {
return stricmp(lhs.c_str(), rhs.c_str()) < 0;
}
};
std::map<std::string, int, comp> st;
修改:
如果您无法使用stricmp
或strcasecmp
,请使用:
#include<algorithm>
//...
string tolower(string s) {
std::transform(s.begin(), s.end(), s.begin(), ::tolower );
return s;
}
struct comp {
bool operator() (const std::string& lhs, const std::string& rhs) const {
return tolower(lhs) < tolower(rhs);
}
};
std::map<std::string, int, comp> st;
答案 1 :(得分:2)
有两种方法可以做到这一点
首先 - 更改“比较”功能以忽略大小写
第二 - 每当你使用一个字符串来放置或从地图中获取一个值时,用一个将它变成小写的函数包装它。
首先,你需要做的是创建一个“函数类”(一个带有operator()的类),它接收两个字符串并返回左边是否比右边“小”:
struct my_comparitor{
bool operator()(const std::string &a, const std::string &b){
// return iwhether a<b
}
};
std::map<std::string,DATA_TYPE,my_comparitor> my_map;
对于第二个,只需这样做:
std::map<std::string,DATA_TYPE> my_map;
my_map.insert(std::make_pair(TO_LOWERCASE("hello"),1));
iter=my_map.find(TO_LOWERCASE(key));
cout << my_map[TO_LOWERCASE(name)];
// etc.
我不确定转换为小写的函数是否已经是stl的一部分 - 但无论哪种方式都很容易编写。