Оптимизация инициализации на картах: переадресация ключа

У меня есть вопрос, который должен быть интересным. Я бы хотел «прямая инициализация«элемент в std::unordered_map на строительстве.

Это детали. У меня есть хэш-карта от std::string в пользовательский класс propкоторый в моих снах инициализировал бы переменную-член, вычисляющую хеш строки перешел к std::unordered_map::operator[],

Это удобный код, который я написал, но я не знаю, с чего начать.

Почему эта проблема? Потому что я хотел бы избежать чего-то вроде «если строка НЕ ​​находится в контейнере, вычислите хэш; prop«. Избегая этого if может быть что-то, что может повлиять на мои выступления. Таким образом, конструктор, как и хеширование, будет выполнен только один раз, когда карта добавит новый элемент в контейнер. Было бы здорово.

Есть намеки?

Спасибо & Ура!

#include <iostream>
#include <string>
#include <unordered_map>

class prop
{
public:
prop(std::string s = "") : s_(s), hash_(std::hash<std::string>()(s))
{
// Automagically forwarding the string in the unordered_map...
};

std::string s_;
std::size_t hash_;
int x;
};

int main(int argc, const char * argv[])
{
// Forward the std::string to the prop constructor... but how?
std::unordered_map<std::string, prop> map;

map["ABC"].x = 1;
map["DEF"].x = 2;
map["GHI"].x = 3;
map["GHI"].x = 9; // This should not call the constructor: the hash is there already

std::cout << map["ABC"].x << " : " << map["ABC"].s_ << " : " << map["ABC"].hash_ << std::endl;
std::cout << map["DEF"].x << " : " << map["DEF"].s_ << " : " << map["DEF"].hash_ << std::endl;
std::cout << map["GHI"].x << " : " << map["GHI"].s_ << " : " << map["GHI"].hash_ << std::endl;

std::cout << map["XXX"].x << " : " << map["XXX"].s_ << " : " << map["XXX"].hash_ << std::endl;

return 0;
}

0

Решение

Просто используйте свой класс prop в качестве ключа вместо строки:

#include <iostream>
#include <string>
#include <unordered_map>

class prop
{
public:
prop(std::string s = "") : s_(s), hash_(std::hash<std::string>()(s))
{
// Automagically forwarding the string in the unordered_map...
};

std::string s_;
std::size_t hash_;
};

int main(int argc, const char * argv[])
{
// Forward the std::string to the prop constructor... but how?
std::unordered_map<prop, int, ...> map( ... );

prop pABC( "ABC" ), pDEF( "DEF" ), pGHI( "GHI" );

map[pABC] = 1;
map[pDEF] = 2;
map[pGHI] = 3;
map[pGHI] = 9;

std::cout << map[pABC] << " : " << pABC.s_ << " : " << pABC.hash_ << std::endl;
std::cout << map[pDEF] << " : " << pDEF.s_ << " : " << pDEF.hash_ << std::endl;
std::cout << map[pGHI] << " : " << pGHI.s_ << " : " << pGHI.hash_ << std::endl;

prop pXXX( "XXX" );
std::cout << map[pXXX] << " : " << pXXX.s_ << " : " << pXXX.hash_ << std::endl;

return 0;
}

Я опустил пользовательский хеш и сравнил функцию, идея должна быть ясной без нее.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]