Лично я бы определил тип значения, который не чувствителен к регистру и который превращается в строку по простейшей подсказке.Таким образом, я могу использовать стандартные модели хешей и предикатов.
#include <string>
#include <unordered_set>
#include <iostream>
#include <algorithm>
#include <iterator>
class LCString
{
std::string data;
public:
operator std::string&() {return data;}
operator std::string const&() const {return data;}
LCString(char const* init)
{
std::transform(init, init + strlen(init),
std::back_inserter(data), &::tolower);
}
};
int main()
{
typedef std::unordered_set<LCString,
std::hash<std::string>,
std::equal_to<std::string> > MySet;
MySet data;
data.insert("Apples");
data.insert("apples");
std::copy(data.begin(), data.end(),
std::ostream_iterator<std::string>(std::cout, " - "));
std::cout << "\n";
}
Таким образом, мы помещаем в набор только строчные значения:
> g++ pl.cpp
> ./a.out
apples -
>
Редактирование Сохранение регистра:
class LCStringOriginalPreserved
{
std::string original;
std::string data;
public:
operator std::string&() {return data;}
operator std::string const&() const {return data;}
std::string& getOriginal() {return original;}
LCString(char const* init)
: original(init)
{
std::transform(original.begin(), original.end(),
std::back_inserter(data), &::tolower);
}
};