Reputation: 39
When I make a 2D vector.
std::vector<std::vector<Pokemon>> pokemons;
Can I run this straight away:
Pokemon pikachu = ...
pokemons[23].push_back(Pikachu);
Or do I need to:
pokemons.reserve(100);
for (int i =0;i<100;i++) pokemons.push_back(vector<Pokemon>());
Thank you
Upvotes: 2
Views: 884
Reputation: 16
Are you sure the vector is the most appropriate container you are looking for? Check How can I efficiently select a Standard Library container in C++11?
If '23' is really important, then you could for example use associative container:
typedef std::map<int, pokemon> TPokemons;
TPokemons pokemons;
pokemons[23] = pikachu;
Maybe the order is not important and an unordered map would be better
Upvotes: 0
Reputation: 1681
Can I run this straight away:
Pokemon pikachu = ... pokemons[23].push_back(Pikachu);
Not straight away, because your pokemons
array does not have any elements yet, so pokemons[23]
will be an out-of-bounds error.
Otherwise, once your pokemons
array is populated, then yes, you can just push_back
on one of its elements.
Or do I need to:
pokemons.reserve(100); for (int i =0;i<100;i++) pokemons.push_back(vector<Pokemon>());
reserve()
is only to allocate (reserve) memory for your vector, if you have a good idea of how many elements you will end up having, to avoid multiple memory allocations and potential moves. You do not need to reserve()
, but it is a good idea if you will need a decent amount of memory.
Upvotes: 0
Reputation: 92231
You can set the initial size of the outer vector during construction
std::vector<std::vector<Pokemon>> pokemons(100);
and it will build 100 inner empty vectors.
Upvotes: 5