I recommend using std::vector for this. Arrays sizes are determined and unchangeable upon compile. Vectors are very dynamic and customizable. If you have to use an array I would suggest copying over the array with the selected value removed from it, but the array size will still have to be the same.
1) you could make the array data type a struct or class with a 'is deleted' field.
2) if the data is not sorted, you can swap the deleted guy with the last guy and -- the current size of the container.
3) if the data is sorted, you can do a memmove or similar routine (very inefficient) to shuffle the data internally to close the gap.
4) similar to #1 you can keep a side by side array of bool on what locations are in use.
As already said you can use vector which is the better approach. #2 very good. The others are clunky.