its your code, you can attack your specific problem directly.
say you allocated 3 and get a 4th. then you reallocate 100. then you get your 101st and you reallocate 200. the exact algorithm you use to guess how many to preallocate each time can be complicated (it can do stuff like track how many inserts you get vs deletes and all that and predict) or simple (it can allocate twice the current size every time, but it can very quickly drain the machine of memory) or linear (add 100, or 1000, or a million, whatever, each time you reallocate).
as for reallocation ... you can use the C memory stuff or you can make a new pointer with the extended size and copy the old data over into it, then destroy the old smaller buffer (this is what realloc does, but if you need to use new/delete instead, you do it this way). If your buffers do not need to be continuous memory like vectors or arrays, you can even just do a convoluted linked list type memory allocation and chain the blocks together as you create them (this is a bit of a mess, but its doable). Do you need solid blocks of memory? (this is just like a linked list, except each node contains a pointer full of data). It can even be efficient to do that, if you search or process each node of the chains in a thread :)
All that to say: be creative if you want to solve a specific problem or class of problems. Use known datastructures and patterns if you want a generic tool. Figure out what you want, then build it, in other words. <vector> is not that complicated, it is just hiding the pointer junk from you, storing the size and type info under the hood (the type is not explicitly stored, but its in the c++ infrastructure) and providing some interfaces into the data. It could be recreated in a day or two by even a student, I believe, if the person understands pointers pretty well.
read this:
https://en.cppreference.com/w/c/memory/realloc
your question about realloc is tied to the second approach on how the function works. see a, b parts and part b in particular.
keep this in mind:
allocating, releasing, and copying are all expensive operations. Your tool should minimize these things as best it can for your problems, which is where you may want to deviate from the vector approach and cook your own solution based off how you think you will use this tool.