C++ <vector> fonction begin / end

Classe conteneur C++ <vector>


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érateur
  • endrenvoie 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 <iostream>
#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 :

  1. numbers.begin()Renvoie un itérateur pointant vers le premier élément (10).
  2. numbers.end()Renvoie un itérateur pointant vers la position après le dernier élément.
  3. Condition de boucleit != 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 <iostream>
#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 automatiquementbegin()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 <iostream>
#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 <iostream>
#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 <iostream>
#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 utiliserend() - 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 <iostream>
#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 <iostream>
#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.

Classe conteneur C++ <vector>

autres extensions