主要問題是聲明你的容器。
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