主要问题是你的容器的声明。
boost::unordered_map< std::string , Domain::SomeObject > objectContainer;
如果查看来源,我们会看到:
template<typename Key, typename Mapped, ...>
class unordered_map;
iterator find(const Key &);
所以,你有严格的接口限制。方法 find 始终使用 Key 类型作为参数,如果不更改容器键类型,则无法更改它。
如果您确定在 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);
}
};
现在,buffer 只在构造函数中分配一次内存,而不是每次调用 find 时。
其他方式,使用您自己的密钥类型,它可以使用 std::string 和 const char *,但在这种情况下,您应该使用您的密钥类型定义 Hash(boost::hash<Key>)、谓词 (std::equal_to<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 变得很不舒服。