nullpointer
nullpointer

Reputation: 189

Are vector elements guaranteed to be in order?

I understand that having pointers to elements of a vector is a bad idea, because upon expanding, the memory addresses involved will change, therefore invalidating the pointer(s). However, what if I were to simply use an integer that holds the index number of the element I want to access? Would that be invalidated as the vector grows in size? What I am thinking of looks something like this:

    #include <vector>

    class someClass{
    string name
    public: string getName(){return name;}
    };

    vector<someClass> vObj;
    int currIdx;
    string search;
    cout<<"Enter name: ";
    cin>>search;

    for(int i=0; i<vObj.size(); i++){
      if(vObj[i].getName()==search)
         currIdx = i;}

Upvotes: 3

Views: 13264

Answers (4)

Srikant Krishna
Srikant Krishna

Reputation: 881

It shouldn't, as the system will simply allocate more memory and then do a memcopy.

Order should be preserved in the std::vector STL template.

And yes, if you delete elements the ordering will change. But if you are going to be doing a lot of deletes, use a different data structure such as a linked list.

Upvotes: 0

Andy Prowl
Andy Prowl

Reputation: 126412

I think the title of your question and what you seem to be asking do not really match. No vector is by definition guaranteed to be sorted, so elements won't be "in order".

Moreover, all iterators and references to elements of a vector will be invalidated upon insertion only if reallocation occurs (i.e. when the size of the vector exceeds its capacity). Otherwise, iterators and references before the point of insertion will not be invalidated (see Paragraph 23.3.6.5/1 of the C++11 Standard).

Storing an index is only subject to a potential logical invalidation: if you insert elements into the vector in a position prior to the one you are indexing, the element you were indexing will be shifted one position to the right, and the same index will now refer to a different element ; likewise, if you erase an element prior to the position you were indexing, the element you were indexing will be shifted on position to the left - and your index may now refer to a position which is out-of-bounds.

Upvotes: 3

Tyler Jandreau
Tyler Jandreau

Reputation: 4335

No, the index numbers are not invalidated when the vector is expanded. Since you're declaring that the vector container object is not a pointer vector<someClass> instead of vector<someClass*>, your pointed to element will be preserved as well.

Upvotes: 0

us2012
us2012

Reputation: 16253

No, the index numbers are of course not invalidated when the vector expands. They are invalidated (in the sense that you no longer find the same elements at a constant index) if you erase a previous element, though:

vector: 3 5 1 6 7 4

Here, vector[2] == 1. But if you erase vector[1] (the 5), then afterwards, vector[2] == 6.

Upvotes: 6

Related Questions