std::vector<CustomClass *> whatever(20000);
ou:
std::vector<CustomClass *> whatever;
whatever.reserve(20000);
O primeiro define o tamanho real da matriz - ou seja, torna um vetor de 20.000 ponteiros. O último deixa o vetor vazio, mas reserva espaço para 20000 ponteiros, para que você possa inserir (até) muitos deles sem que seja necessário realocar.
Pelo menos na minha experiência, é bastante incomum que qualquer um deles faça uma enorme diferença no desempenho - mas pode afetar a correção em algumas circunstâncias. Em particular, desde que nenhuma realocação ocorra, é garantido que os iteradores no vetor permanecem válidos. Depois de definir o tamanho / espaço reservado, você garante que não haverá realocações desde que você não t aumentar o tamanho além disso.
std::vector
referência, dependendo do que melhor se adapta às suas necessidades.