Основной проблемой является объявление вашего контейнера.
boost::unordered_map< std::string , Domain::SomeObject > objectContainer;
Если посмотреть на источник, мы увидим:
template<typename Key, typename Mapped, ...>
class unordered_map;
iterator find(const Key &);
Итак, у вас есть строгие ограничения по интерфейсу.Метод find всегда использует тип ключа в качестве параметра, и вы не можете изменить его, не изменив тип ключа контейнера.
Если вы уверены, что теряете слишком много времени при инициализации std :: string, вы можете использовать буфер (если нет потоков).Например:
class objectContainer : public boost::unordered_map<std::string, SomeObject>
{
std::string _buffer;
public:
typedef boost::unordered_map<std::string, SomeObject> inherited;
objectContainer() { _buffer.reserve(1024); }
typename inherited::iterator find(const char * key)
{
_buffer = key;
return inherited::find(_buffer);
}
};
Теперь буфер выделяет память только один раз в конструкторе, а не каждый раз, когда вызов находит.
Другой способ, используйте свой собственный тип ключа, который может работать с std :: stringи const char *, но в этом случае вам следует определить реализацию Hash (boost::hash<Key>
), предикат (std::equal_to<Key>
) с вашим типом Key.
Примерно так:
class Key
{
public:
virtual ~Key();
virtual const char * key() = 0; // for hash and predicate
};
// predicate
struct equal_to_Key : binary_function <Key,Key,bool> {
bool operator() (const Key & x, const Key & y) const
{
return false; // TODO : compare Key here
}
};
class CharKey : public Key
{
const char * _key;
public:
virtual const char * key() { return _key; }
};
class StringKey : public Key
{
std::string _key;
public:
virtual const char * key() { return _key.c_str(); }
};
Теперь у вас есть один способ получить const char * и использовать его в хеше и предикате.Когда вы вставляете строку, вы предпочитаете использовать StringKey.Когда находят - CharKey.
boost::unordered_map< Key , Domain::SomeObject, KeyHashFunctor, equal_to_Key > objectContainer;
void findStuff(const char* key) {
auto it = objectContainer.find(CharKey(key));
}
Но в этом случае добавленные виртуальные функции и создание объектов Key могут снизить производительность, и работа с objectContainer стала неудобной.