web-dev-qa-db-fra.com

Comment accéder au contenu d'un vecteur à partir d'un pointeur sur le vecteur en C ++?

J'ai un pointeur sur un vecteur. Maintenant, comment puis-je lire le contenu du vecteur via un pointeur?

51
Pavan Dittakavi

Il existe de nombreuses solutions, en voici quelques-unes:

int main(int nArgs, char ** vArgs)
{
    vector<int> *v = new vector<int>(10);
    v->at(2); //Retrieve using pointer to member
    v->operator[](2); //Retrieve using pointer to operator member
    v->size(); //Retrieve size
    vector<int> &vr = *v; //Create a reference
    vr[2]; //Normal access through reference
    delete &vr; //Delete the reference. You could do the same with
                //a pointer (but not both!)
}
72
Seb Holzapfel

Accédez-y comme n'importe quelle autre valeur de pointeur:

std::vector<int>* v = new std::vector<int>();

v->Push_back(0);
v->Push_back(12);
v->Push_back(1);

int twelve = v->at(1);
int one = (*v)[2];

// iterate it
for(std::vector<int>::const_iterator cit = v->begin(), e = v->end; 
    cit != e;  ++cit)
{
    int value = *cit;
}

// or, more perversely
for(int x = 0; x < v->size(); ++x)
{
    int value = (*v)[x];
}

// Or -- with C++ 11 support
for(auto i : *v)
{
   int value = i;
}
17
Chad

Avez-vous un pointeur sur un vecteur parce que c'est ainsi que vous l'avez codé? Vous voudrez peut-être reconsidérer cela et utiliser une référence (éventuellement const). Par exemple:

#include <iostream>
#include <vector>

using namespace std;

void foo(vector<int>* a)
{
    cout << a->at(0) << a->at(1) << a->at(2) << endl;
    // expected result is "123"
}

int main()
{
    vector<int> a;
    a.Push_back(1);
    a.Push_back(2);
    a.Push_back(3);

    foo(&a);
}

Bien que ce programme soit valide, le style général C++ consiste à transmettre un vecteur par référence plutôt que par pointeur. Cela sera tout aussi efficace, mais vous n'aurez alors pas à vous occuper de pointeurs null, d'allocation/nettoyage de mémoire, etc. Utilisez une référence const si vous n'allez pas modifier le vecteur, et une référence non const si vous devez faire des modifications.

Voici la version de référence du programme ci-dessus:

#include <iostream>
#include <vector>

using namespace std;

void foo(const vector<int>& a)
{
    cout << a[0] << a[1] << a[2] << endl;
    // expected result is "123"
}

int main()
{
    vector<int> a;
    a.Push_back(1);
    a.Push_back(2);
    a.Push_back(3);

    foo(a);
}

Comme vous pouvez le constater, toutes les informations contenues dans un seront transmises à la fonction foo, mais celle-ci ne copiera pas une valeur entièrement nouvelle, car elle est passée par référence. Il est donc tout aussi efficace que de passer d'un pointeur à l'autre. Vous pouvez l'utiliser comme une valeur normale plutôt que de devoir déterminer comment l'utiliser comme pointeur ou de le déréférencer.

16
Andrew Rasmussen
vector<int> v;
v.Push_back(906);
vector<int> * p = &v;
cout << (*p)[0] << endl;
11
Mark Ransom

Vous pouvez accéder directement aux méthodes d'itérateur:

std::vector<int> *intVec;
std::vector<int>::iterator it;

for( it = intVec->begin(); it != intVec->end(); ++it )
{
}

Si vous voulez l'opérateur d'accès au tableau, vous devez dé-référencer le pointeur. Par exemple:

std::vector<int> *intVec;

int val = (*intVec)[0];
6
Jon Benedicto

Il y a beaucoup de solutions. Par exemple, vous pouvez utiliser la méthode at().

* Je pensais que tu cherchais un équivalent de [] _ opérateur.

2
eugene_che