memC
memC

Reputation: 1025

creating a vector with references to some of the elements of another vector

I have stored instances of class A in a std:vector, vec_A as vec_A.push_back(A(i)). The code is shown below.

Now, I want to store references some of the instances of class A (in vec_A) in another vector or another array. For example, if the A.getNumber() returns 4, 7, 2 , I want to store a pointer to that instance of A in another vector, say std:vector<A*> filtered_A or an array.

Can someone sow me how to do this?? Thanks!

class A {
      public:
             int getNumber();            
             A(int val);
             ~A(){};
      private:
              int num;
};

A::A(int val){
         num = val;
         };

int A::getNumber(){
    return num;
};

int main(){
    int i  =0;
    int num;    
    std::vector<A> vec_A;
    for ( i = 0; i < 10; i++){
        vec_A.push_back(A(i));
        }

    std::cout << "\nPress RETURN to continue...";
    std::cin.get();

    return 0;
}

Upvotes: 1

Views: 1065

Answers (3)

St&#233;phane
St&#233;phane

Reputation: 6905

int main(){ 
    std::vector<A *> vec_A;
    std::vector<A *> vec_filtered_A;
    // build the first vector : 0..4 repeated once
    for (int i = 0; i < 10; i++){
        vec_A.push_back(new A(i%5));
        }
    // build a vector containing all pointers to objects A where value == 2
    int target = 2;
    for (int i = 0; i < 10; i++){
        if (vec_A[i].getNumber() == 2) {
            // this time it copies pointers
            vec_filtered_A.push_back(vec_A[i]);
            }
        }
    // at this point we have two elements in vec_filtered_A : 
    // vec_filtered_A[0] == vec_A[2]
    // vec_filtered_A[1] == vec_A[7]

    // clean up
    while (~vec_A.empty()) {
        delete vec_A.back();
        vec_A.pop_back();
        }

    return 0;
}

Upvotes: 0

R Samuel Klatchko
R Samuel Klatchko

Reputation: 76531

I think the safest thing would be to have a second vector that holds indexes into the first vector:

using std::vector;
vector<A> main;
vector<vector<A>::size_type> secondary;

main.push_back(...);
secondary.push_back(main.size() - 1);   // add the index of the last item

Now, to look up an item you take the value in secondary and use that to index into main:

main[secondary[...]];

The reason I recommend this instead of just having secondary store a direct pointer is that every time you add to vector it may need to resize the vector which can invalidate any existing pointers:

using std::vector;
vector<A> vec;
vec.push_back(A());

// get a pointer to the item you just added
A *p0 = &vec[0];

// add another item
a.push_back(A());

// because a push_back() can cause the vector to resize, p0 may no
// longer point to valid memory and cannot safely be dereferenced

Upvotes: 1

Alex Korban
Alex Korban

Reputation: 15126

You can't store references in STL containers, so you'll have to use pointers:

std::vector<boost::shared_ptr<A> > v1, v2;
boost::shared_ptr<A> p(new A(i));
v1.push_back(p);
v2.push_back(v1.at(0));

Upvotes: 0

Related Questions