J'ai un pointeur sur un vecteur. Maintenant, comment puis-je lire le contenu du vecteur à l'aide du pointeur? Je sais que c'est une question fondamentale, mais je suis incapable de trouver une réponse pour la même chose. (C++)Pointeur vers un vecteur
Répondre
Il existe de nombreuses solutions, voici quelques-unes que je suis venu avec:
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!)
}
La référence est un mauvais conseil, car 'new' pourrait return 0. –
@Don Reba - Pas vraiment; sur la plupart des compilateurs une exception est levée: http://stackoverflow.com/questions/550451/will-new-return-null-in-any-case – Schnommus
Aussi, si 'new' ** a ** retourné 0, ** all ** les opérations sur les pointeurs seraient mauvaises, pas seulement l'initialisation de la référence. – Schnommus
Il y a beaucoup de solutions. Par exemple, vous pouvez utiliser la méthode at()
.
* J'ai supposé que vous recherchez un opérateur équivalent à []
.
mais comment connaître le nombre d'éléments dans le vecteur? – Pavan
@ user815961 'v-> size()' renvoie le nombre d'éléments dans le vecteur – Praetorian
Accès comme toute 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;
}
pour "comme tout autre pointeur". Je ne comprends pas la question. Vous avez un pointeur, donc vous utilisez 'thing-> member' au lieu de' thing.member', et c'est la seule différence (dans 99% des cas, etc.) –
vector<int> v;
v.push_back(906);
vector<int> * p = &v;
cout << (*p)[0] << endl;
Vous pouvez accéder aux méthodes iterator directement:
std::vector<int> *intVec;
std::vector<int>::iterator it;
for(it = intVec->begin(); it != intVec->end(); ++it)
{
}
Si vous voulez que l'opérateur d'accès au tableau, vous auriez pour dé-référencer le pointeur. Par exemple:
std::vector<int> *intVec;
int val = (*intVec)[0];
La meilleure façon d'utiliser comme tableau est vector::data()
utiliser membre.
La raison pour laquelle vous utilisez un vecteur est de faire abstraction de l'implémentation sous-jacente (tableau contigu) derrière lui. Cela va à l'encontre des principes orientés objet, pour ne pas dire extrêmement inefficace parce que vous allouez un nouveau tableau entier de taille n, alors que vous pourriez simplement utiliser vec-> at (index). Sans mentionner, cela n'a absolument rien à voir avec la question de l'auteur original, car vous n'utilisez aucun pointeur sur un vecteur. –
Je donnais juste un exemple, si nous voulons connaître le type sous-jacent, nous pouvons utiliser vector :: value_type. mais c'est statiquement interprété. le point entier que je voulais transmettre est data() est le membre pour obtenir le pointeur sous-jacent. Et c'est ce que sa question était. – sarat
Non, la question était de savoir si le «vecteur» pouvait être lu à travers un pointeur. Je ne vois rien dans le PO qui indique quelque chose de plus profond que cela. –
Avez-vous un pointeur sur un vecteur parce que c'est comme cela que vous l'avez codé? Vous pouvez 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 soit un programme valide, le style général C++ est de passer un vecteur par référence plutôt que par le pointeur. Ce sera tout aussi efficace, mais vous n'aurez pas à faire avec des pointeurs null et allocation de mémoire/nettoyage, etc. Utilisez une référence const si vous ne voulez pas modifier le vecteur, et une référence non-const si vous avez besoin de faire des modifications.
est ici la version références 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 voir, toutes les informations contenues dans un sera transmis à la fonction foo, mais il ne sera pas copier une toute nouvelle valeur, puisqu'il est passé par référence. Il est donc aussi efficace que de passer par un pointeur, et vous pouvez l'utiliser comme une valeur normale plutôt que d'avoir à comprendre comment l'utiliser comme pointeur ou devoir le déréférencer.
Cela peut être un commentaire stupide. Mais puisque vous n'utilisez que la méthode at, y a-t-il des avantages à utiliser la syntaxe (* a) [1]? Personnellement j'aime ça car je pense mieux à mes idées et cela me facilite la lecture du code (avec des avantages je veux dire une augmentation de performance significative pour au moins un cas) – patrik
- 1. Passant le vecteur du pointeur vers l'inséreuse
- 2. Tri d'un vecteur contenant un pointeur vers Struct VS Struct
- 3. Affectation de pointeur C++ (pointer vers un vecteur)
- 4. Pointeur C++ vers un vecteur d'objets, besoin d'accéder aux attributs
- 5. Repousser un pointeur dans un vecteur C++
- 6. Référencer un pointeur vers une structure qui contient un pointeur vers un pointeur vers une structure
- 7. Pointeur intelligent ou pointeur régulier pour le vecteur du vecteur
- 8. pointeur vers un pointeur vers un mal de tête structueux. .
- 9. C++ vecteur pointeur
- 10. pointeur de std :: vecteur de std :: vecteur
- 11. iterator avec pointeur vecteur
- 12. uBLAS vecteur pointeur
- 13. Pointeur dans le vecteur
- 14. pointeur de vecteur complexe
- 15. pointeur vers un pointeur par rapport à un pointeur
- 16. pointeur vers pointeur vers et pointeur vers des tableaux
- 17. Pointeur vers un pointeur dans l'objectif-c?
- 18. En C++, comment pousser un objet vers un vecteur tout en maintenant un pointeur sur l'objet?
- 19. pointeur vers le pointeur?
- 20. Pointeur vers un pointeur pointant vers un bloc de mémoire, quel pointeur doit être libéré?
- 21. Suppression d'un pointeur d'un vecteur
- 22. Comment configurer une fonction qui renvoie un pointeur vers un vecteur en C++?
- 23. Effacement d'un pointeur d'un vecteur
- 24. Comment déclarer un pointeur sur un pointeur vers un tableau?
- 25. Comment faire un itération sur un pointeur vers un pointeur?
- 26. `void *` vers un autre pointeur
- 27. un pointeur vers l'interface IUpdate2
- 28. pointeur vers pointeur avec argv
- 29. C - Chargement d'une struct contenant un pointeur vers un pointeur
- 30. Obtenir avertissement avec un pointeur vers un pointeur et NSError
Qu'avez-vous essayé jusqu'à présent? Pouvez-vous fournir un code, afin que nous puissions avoir quelque chose de concret à discuter? – Nate
Etes-vous sûr de vouloir utiliser un pointeur sur un vecteur? Il pourrait être plus logique d'utiliser une référence. Voir mon message ci-dessous. –