c ++ std :: vector vérifier si premier ou dernier élément
J'ai le texte suivant for each
code C++:
for (auto item : myVector)
{
std::cout << item;
if (item == orderBy.IsLast()) <--- Check if this is the last element
std::cout << "(Is last element) " << std::endl;
else if (item == orderBy.IsFirst()) <-- Check if this is the first element
std::cout << "(Is first element)" << std::endl;
}
Bien sûr IfLast()
et IfFirst()
n'existent pas sur std::vector
. Est-il originaire std::
façon de le vérifier pour le premier et le dernier élément ?
source d'informationauteur Mendes | 2015-05-13
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas utiliser la gamme à base de
for
dans ce cas, comme ce genre defor
"cache" l'itérateur, et vous auriez besoin d'un compteur de garder une trace de la position dans le vecteur. Vous pouvez simplement faireNoter que la simple comparaison de
my.Vector.back()
avec votre élément à partir d'une gamme à base de pour est OK seulement si vous êtes sûr que vous n'avez pas de doublons dans le vecteur. Mais si par exemple la valeur du dernier élément apparaît plusieurs fois dans le vecteur, vous allez trouver que sa première position. C'est pourquoi il n'y a vraiment pas de bonne façon d'utiliser toute une gamme à base defor
sans un index supplémentaire qui conserve la trace de l'endroit où exactement dans le vecteur.MODIFIER Voir aussi @thelink2012 réponse à la façon de "tromper" votre gamme à base de
for
de sorte que vous pouvez obtenir la position de l'élément implicitement.Utiliser le
std::vector::front
etstd::vector::
pour obtenir un référence pour les données de la première et de la dernière position.De référence est un mot-clé ici, car vous pourriez vérifier efficacement l'adresse de votre itération
item
et l'adresse de l'respectives avant/arrière références. Dans votre exemple, vous prenez leitem
par la valeur de référence peut-être même ce ne serait pas de travail, de prendre en considération cet exemple que j'avais de travailler avec cette méthode:Si l'objet surcharges de l'adresse de l'opérateur
&
(même si c'est considéré comme une mauvaise pratique) vous pouvez utiliserstd::addressof
à la place.Cette méthode ne fonctionnera pas cependant pour le
std::vector<bool>
spécialisation, car il optimise le vecteur pour stocker des valeurs booléennes efficacement avec bits, et puisque nous ne pouvons pas avoir des références à des bits, tous les éléments de cette structure de données est un objet proxy pas exactement liée à l'adresse des données internes.Utilisation
std::vector::front()
pour le premier élément.Utilisation
std::vector::back()
pour le dernier élément.Avant d'appeler ces fonctions, assurez-vous que le
vector
n'est pas vide.Pour la base de la valeur de comparaison, vous pouvez utiliser
myVector.front()
/myVector[0]
comme la première et lamyVector.back()
/myVector[myVector.size()-1]
que le dernier élément.Suggestion
La Capture de la référence par défaut pour éviter les copies. par exemple,
for(const auto& I : myVector)
Si vous avez des cas particuliers pour les limites que vous devez utiliser de l'ol' itérateur version, mais en séparant le premier et le dernier cas, loin de la boucle.
Si le cas de partager le code après que si vous encapsuler sur une fonction.
Je ne peux pas écrire de code à partir de mon téléphone :c
Vous pouvez rechercher de nouveau, mais ce serait plutôt inefficace. Si vous avez besoin d'informations sur la position de l'élément en cours, vous voudrez probablement utiliser un itérateur ou un indice:
Cela fonctionne pour moi