主要问题是声明你的容器。
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);
}
};
现在,缓冲构造中分配内存只有一次,而不是每次调用时发现。
其他方式,使用自己的密钥类型可工作的std :: string,并为const char *,但在这种情况下,你应该用你的密钥类型定义执行哈希(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的工作变得不舒服。
类型我不知道“时间”在这里是正确的字你某种星际旅行的人 – 2012-02-25 12:45:53
? @KerrekSB:“星际迷航”与它有什么关系?“Temporal”是一个真实的词,尽管你是对的,因为它不是正确的使用。 – 2012-02-25 13:07:26
感谢您修复它,我不时混合与西班牙语 – lurscher 2012-02-25 13:16:53