Link to home
Start Free TrialLog in
Avatar of mizizike
mizizike

asked on

Question about Pointers and arrays

Hello. I am currently trying to make a class similar to that of the vector class. I am attempting to make a push_back function. The idea is to have an array of integers of a specified size, say like two ( int array[2] ). The push_back function would then push_back an element into this array. However, if the push_back is called three times, then a NEW array is created with double the space ( int array_two[4] ) and then the elements from the first array, are copied over to the second array. I can achieve this easily. However, I would need the first array to somehow point to the second array, while the first array ELEMENTS were deleted and the second array POINTER were deleted. The result would be a never ending supply of array space, much like a vector. Here is my sample code so far, however, it does not do what I need it to:

void vector<int>::push_back(const int& data)
{
      if(THE_ARRAY_CAPACITY > THE_SIZE_SO_FAR)
      {
            //we have room
            theDataPtr[THE_SIZE_SO_FAR] = data;
            THE_SIZE_SO_FAR++;
      }
      else
      {
            int* TempPtr = new int[(THE_ARRAY_CAPACITY*2)];
            for(unsigned int i = 0; i<THE_ARRAY_CAPACITY; i++)
            {
                  TempPtr[i] = theDataPtr[i];
            }
            THE_ARRAY_CAPACITY = THE_ARRAY_CAPACITY*2
            theDataPtr = TempPtr;
            theDataPtr[THE_SIZE_SO_FAR] = data;
            THE_SIZE_SO_FAR++;
            delete TempPtr;      
      }
}

If there is something wrong with this code, or perhaps another way to do it, help would be GREATLY appreciated.
Avatar of teratoma
teratoma

Your code isn't very pretty and has some problems std::vector doesn't have, but I can see only one thing really wrong with it.  See anything wrong with this sequence of events?

 int* TempPtr = new int[(THE_ARRAY_CAPACITY*2)];
 theDataPtr = TempPtr;
 delete TempPtr;  

I'll let you think about it a little...

You just deleted your data :)
I **THINK** what a typical implmentation of vector does is when it reaches the capacity of its current underlying array, it allocates a brand new array that's 50% larger than the current array, does a memcopy (or equivelent) of the current array into the new array, deletes the current array, and finally makes the new array the current array.
ASKER CERTIFIED SOLUTION
Avatar of rafd123
rafd123

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Hi teratoma,
> 1.5 ... the golden ratio
That depends very much on the actual use. Arrays and dynamic strings are small in most case, but when they get bigger, they tend to get really big. I think a 90/10 distribution is realistic in many cases: 10% of all arrays or strings take 90% of the memory.

If you're concerned about memory use in your special case and don't have to write a generic routine, create some statistics as part of a volume test. In case you can't do that, use a constructor with optional growth parameters. Factors are fine for big instances, but constants are usually better.

Cheers!

Stefan
Avatar of mizizike

ASKER

Wow. Ive used this experts exchange before, but this is the only time I was given the chance to think, plus presented with multiple solutions, and why they should work. I really enjoyed all of the help given to me. To be honest, I am writing a templated vector class, but I thought it would easier in this case of presenting a question, to replace all of the "template <typname T>" with "int" instead. I now understand that this can affect what I am trying to achieve very much. Thanks again for all your help.