I'm using a type Id
which is defined in another part of the code I'm using:
typedef int Id;
Now I am provided many objects, each of which comes with such an Id
, and I would like to use the Id
as index into a std::vector
that stores these objects. It may look something like this:
std::vector<SomeObj*> vec(size);
std::pair<Id, SomeObj*> p = GetNext();
vec[p.first] = p.second;
The problem is that std::vector
uses its own type to index its elements: std::vector::size_type
(why isn't that templated?).
So strictly, it would be better to use std::map<Id, SomObj*>
, but that would be less efficient, and an array is what I really need here (I know that the indices of all the objects are contiguous and start with 0
). Another problem is that the typedef int Id
might change to typedef long int Id
or similar in the future ... (it is part of my own code though, so I control it, but ideally I should be allowed to change the typedef
at some points; that's what a typedef is for).
How would you deal with this? Maybe use unordered_map<Id, SomeObj*>
, where the hash function directly uses the Id
as hash key? Would that be less memory-efficient? (I don't completely understand how unordered_map
allocates its space given that the range of the hash function is unknown in advance?)