У меня есть std::map<std::pair<std::string, std::string>, float>
, который занимает слишком много памяти, и чтобы использовать меньше памяти, я решил сопоставить уникальные строки с целыми числами (например, std::map<std::string, int>
, где каждая новая уникальная строка сопоставляется с текущим size()
карты ) и используйте эти целочисленные значения в качестве парных ключей к карте (например, std::map<std::pair<int, int>, float>
).
Вместо int
я хочу использовать std::map::size_type :
using map_index = std::map::size_type;
std::pair<map_index, map_index> key;
Конечно, это не компилируется, потому что мне нужно предоставить список аргументов для карты:
vector.cc:14:19: error: invalid use of template-name `std::map' without an argument list
using map_index = std::map::size_type;
И это (теоретически) то, чего я пытаюсь достичь:
using map_index = std::map<std::string, map_index>::size_type;
что дает следующую (ожидаемую) ошибку компилятора:
vector.cc:15:41: error: `map_index' was not declared in this scope
using map_index = std::map<std::string, map_index>::size_type;
Как правильно заставить компилятор вывести правильный value_type
для std::map
, value_type
которого является его собственным size_type
?
size_type
, вам сначала нужно сказать, что такоеvalue_type
, а не наоборот. Когда вы знаете тип карты, получить ееsize_type
несложно. - person 463035818_is_not_a_number   schedule 22.11.2018size_type
является частьюvalue_type
для OP. - person Some programmer dude   schedule 22.11.2018size_t
(как обычно и будетsize_type
)? - person Some programmer dude   schedule 22.11.2018map::size_type
- это просто псевдонимtypedef
всегда одного и того же типа - person 463035818_is_not_a_number   schedule 22.11.2018size_t
, илиunsigned long int
, или даже простоint
и игнорировать предупреждения о преобразовании типов, но на самом деле я пытаюсь понять, как получитьstd::map::size_type
для карты, которая использует результаты своего собственногоstd::map::size()
в качестве своих значений. . Я надеюсь, что есть общее решение, основанное на шаблонах. - person vallismortis   schedule 22.11.2018std::map<K, V>::size_type
скорее всего полностью не зависит от какK
, так иV
. Если вам действительно не все равно, вы можетеstatic_assert(std::is_same_v<Map::size_type, Map::mapped_type>, "Unexpected size_type")
- person Caleth   schedule 22.11.2018std::map<std::string, X>
будет boost::flyweight быть лучшим решением? - person felix   schedule 22.11.2018