C++ <vector> fonction begin / end
beginetendest la fonction d'itérateur la plus importante dans vector, utilisée pourObtenir les itérateurs de début et de fin du conteneur。
beginetendsont des fonctions membres des classes de conteneurs :
beginrenvoie un pointeur vers le premier élément du conteneurItérateurendrenvoie une position après le dernier élément du conteneurItérateur(Itérateur sentinelle)
Ces deux fonctions sont la base des algorithmes de la bibliothèque standard C++ et des boucles for basées sur des intervalles.
Définitions de mots: beginReprésente "begin",endReprésente "end".
Syntaxe de base et paramètres
beginetendsont des fonctions membres des classes conteneurs, et leur appel ne nécessite aucun argument.
Format de syntaxe
iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const;
Description des paramètres
- Paramètre: Aucun paramètre
- Ces fonctions n'acceptent aucun paramètre.
Description de la fonction
- Valeur de retour:
begin()Retourne un itérateur pointant vers le premier élément.end()Retourne un itérateur (sentinelle) pointant vers la position après le dernier élément.
- Effet: L'itérateur retourné peut être utilisé pour parcourir le conteneur ou pour travailler avec des algorithmes.
- Remarque:
end()L'itérateur retourné pointe vers une position "virtuelle" ; il ne peut pas être déréférencé, seulement utilisé pour la comparaison.
Exemple
Maîtrisons à fond à travers une série d'exemplesbeginetendUtilisation.
Exemple 1 : Utilisation de base - parcours du conteneur
Exemple
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// Parcourir à l'aide d'un itérateur
std::cout << "Parcours à l'aide d'un itérateur : ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
Sortie attendue :
使用迭代器遍历: 10 20 30 40 50
Analyse du code :
numbers.begin()Renvoie un itérateur pointant vers le premier élément (10).numbers.end()Renvoie un itérateur pointant vers la position après le dernier élément.- Condition de boucle
it != numbers.end()Garantit le parcours de tous les éléments.
Exemple 2 : boucle for basée sur une plage
La boucle for basée sur des plages introduite en C++11 utilise essentiellement en son cœurbeginetend。
Exemple
#include <vector>
#include <string>
int main() {
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
// Boucle for basée sur une plage (utilise en interne begin/end)
std::cout << "Utilisez la boucle for basée sur une plage : ";
for(const auto& name : names) {
std::cout << name << " ";
}
std::cout << std::endl;
return 0;
}
Sortie attendue :
使用范围 for 循环: Alice Bob Charlie
Analyse du code :
- La boucle for basée sur des plages est une façon concise d'utiliser les itérateurs.
- Le compilateur appellera automatiquement
begin()etend()。
Exemple 3 : Utilisation des algorithmes de la STL
Les algorithmes de la bibliothèque standard exigent des itérateurs pour spécifier des plages.
Exemple
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {5, 2, 8, 1, 9, 3};
// Trier
std::sort(numbers.begin(), numbers.end());
std::cout << "Après tri : ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// Rechercher l'élément
auto it = std::find(numbers.begin(), numbers.end(), 8);
if(it != numbers.end()) {
std::cout << "Élément trouvé : " << *it << std::endl;
}
return 0;
}
Sortie attendue :
排序后: 1 2 3 5 8 9 找到元素: 8
Analyse du code :
std::sort(begin, end)Utilisez des itérateurs pour spécifier la plage de tri.std::find(begin, end, value)Utilisez des itérateurs pour spécifier la plage de recherche.
Exemple 4 : Itérateurs inverses
UtilisationrbeginetrendPeut parcourir le conteneur en sens inverse.
Exemple
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// Parcours en avant
std::cout << "Avant : ";
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// Parcours inverse (avec rbegin/rend)
std::cout << "Inverse : ";
for(auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
Sortie attendue :
正向: 1 2 3 4 5 反向: 5 4 3 2 1
Analyse du code :
rbegin()Renvoie un itérateur inverse pointant vers le dernier élément.rend()Renvoie un itérateur inverse pointant vers la position avant le premier élément.
Exemple 5 : Opérations arithmétiques sur les itérateurs
Les itérateurs prennent en charge les opérations arithmétiques, permettant des sauts rapides vers une position spécifiée.
Exemple
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50, 60, 70};
// Obtenir le troisième élément (indice 2)
auto it = numbers.begin() + 2;
std::cout << "begin() + 2 = " << *it << std::endl;
// Calculer la distance entre deux itérateurs
auto first = numbers.begin();
auto last = numbers.end();
auto distance = last - first;
std::cout << "Taille du conteneur (distance) : " << distance << std::endl;
// Obtenir l'élément du milieu
auto mid = numbers.begin() + (numbers.size() / 2);
std::cout << "Élément du milieu : " << *mid << std::endl;
return 0;
}
Sortie attendue :
begin() + 2 = 30 容器大小(距离): 7 中间元素: 40
Analyse du code :
- Prise en charge des itérateurs
+、-et d'autres opérations arithmétiques. - Vous pouvez utiliser
end() - begin()Calculez la taille du conteneur.
Exemple 6 : Conversion entre itérateurs et indices
Les itérateurs et les indices peuvent être convertis entre eux.
Exemple
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// Convertir l'index en itérateur
size_t index = 2;
auto it = numbers.begin() + index;
std::cout << "Indice " << index << " élément correspondant : " << *it << std::endl;
// Convertir l'itérateur en index
auto iter = numbers.begin() + 3;
size_t idx = iter - numbers.begin();
std::cout << "Index correspondant à l'itérateur : " << idx << std::endl;
return 0;
}
Sortie attendue :
索引 2 对应的元素: 30 迭代器对应的索引: 3
Analyse du code :
begin() + indexConvertir un indice en un itérateur.iter - begin()Convertir un itérateur en un indice.
Exemple 7 : Utilisation d'itérateurs pour modifier des éléments
Les itérateurs renvoient des références, qui peuvent être utilisées pour modifier les éléments.
Exemple
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "Avant modification : ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
// Multiplier tous les éléments par 2 à l'aide d'itérateurs
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
*it *= 2;
}
std::cout << "Après modification : ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
Sortie attendue :
修改前: 1 2 3 4 5 修改后: 2 4 6 8 10
Analyse du code :
- Déréférencement d'un itérateur (
*it) renvoie une référence vers l'élément. - Vous pouvez modifier directement cette référence pour changer la valeur de l'élément.
autres extensions