создание вектора со ссылками на некоторые элементы другого вектора - PullRequest
1 голос
/ 15 мая 2010

Я сохранил экземпляры class A в std:vector, vec_A как vec_A.push_back(A(i)). Код показан ниже.

Теперь я хочу сохранить ссылки некоторых экземпляров class Avec_A) в другом векторе или другом массиве. Например, если A.getNumber() возвращает 4, 7, 2, я хочу сохранить указатель на этот экземпляр A в другом векторе, скажем std:vector<A*> filtered_A или массиве.

Может кто-нибудь посеять меня, как это сделать ?? Спасибо!

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;
}

Ответы [ 3 ]

1 голос
/ 15 мая 2010

Я думаю, что самым безопасным было бы иметь второй вектор, содержащий индексы в первом векторе:

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

Теперь, чтобы найти элемент, вы берете значение в качестве вторичного и используете его для индексации в main:

main[secondary[...]];

Причина, по которой я рекомендую это вместо того, чтобы просто хранить вторичный указатель прямого указателя, заключается в том, что каждый раз, когда вы добавляете в вектор, может потребоваться изменить размер вектора, что может сделать недействительными любые существующие указатели:

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
0 голосов
/ 15 мая 2010
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;
}
0 голосов
/ 15 мая 2010

Вы не можете хранить ссылки в контейнерах STL, поэтому вам придется использовать указатели:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...