Obtenez de l'index de l'objet inséré dans un vecteur
Comment puis-je obtenir la position où mon objet était effectivement inséré?
#include <vector>
using namespace std;
vector<SomeClass> list;
SomeClass object;
list.push_back(object);
list[...].method(); //I do not have the key
Malheureusement push_back
ne retourne rien depuis son type de retour est void
.
- Comme un autre conseil, ne jamais utiliser la "liste" comme nom pour une variable, surtout pas pour une variable de type "vecteur". "liste" est aussi un des conteneurs de la bibliothèque standard. Ayant un vecteur nommé liste va être une perpétuelle source de douleur pour n'importe qui qui a à la lecture de ce code.
- J'ai changé le nom de votre classe à partir de
class
(qui n'est pas valide en C++) dansSomeClass
et a ajouté une réflexion sur l'idée derrière l'apparence "trivial comportement".
Vous devez vous connecter pour publier un commentaire.
Si
v
est votre vecteur, le tableau suivant vous donne la position (l'index):Ou vous pouvez regarder la
size()
avant d'appelerpush_back()
. Ensuite, vous n'aurez pas besoin de soustraire un.Vous pouvez utiliser le back() membre pour obtenir une référence au dernier élément:
Ou, depuis push_back (), il suffit d'ajoute l'objet à la fin, l'indice de la nouvelle-élément inséré est le vecteur de taille moins un:
&v.back()-&v.front()
par la suite.Si vous avez besoin de localiser un élément particulier après que vous les avez, et vous ne voulez pas enregistrer l'index à l'avance (dans le cas où vous faites quelque chose pour le vecteur comme de tri/ajouter/supprimer/etc), vous pouvez également utiliser la trouver algorithme.
find
.Tout NPE est la bonne réponse montre une pragmatique de POV, je me concentre sur les raisonnement pour cette réponse simple. Le comportement observable est juste à la fin de la
push_back
de la fonction membre:De sorte que l'indice est toujours égale à
v.size()
avant l'insertion ou, de manière équivalente,v.size()-1
après l'insertion. Si cette affirmation ne peut pas remplies, la capacité du conteneur ne pouvait pas être cultivé ou votre classe, déclenche une exception dans le copier/déplacer le constructeur (voir la section Exceptions dans la documentation).