std::vector, std::pair ET std::optional

Salut ce forum apprends les bases du c++

Moderator: Rick

Post Reply
Hydraxx
Site Admin
Posts: 114
Joined: Mon Jan 12, 2026 4:04 pm
Location: France
Contact:

std::vector, std::pair ET std::optional

Post by Hydraxx »

std::vector, std::pair ET std::optional

À QUOI ÇA SERT ?

Ces trois outils répondent à trois problèmes différents.

std::vector :
"Je veux un tableau dont la taille peut changer."

std::pair :
"Je veux regrouper exactement deux valeurs."

std::optional :
"Je veux représenter une valeur qui peut ne pas exister."


1. std::vector

Code: Select all

std::vector<int> values;
Au départ, il peut être vide.

Ajout :

Code: Select all

values.push_back(10);
values.push_back(20);
Le vector gère automatiquement sa mémoire dynamique.


2. size ET capacity

Code: Select all

values.size()
Nombre d’éléments réellement présents.

Code: Select all

values.capacity()
Nombre d’éléments pouvant tenir dans l’allocation actuelle avant qu’une nouvelle allocation soit nécessaire.

Exemple :

size = 5
capacity = 8

Tu as 5 objets, mais assez de mémoire réservée pour 8.


3. POURQUOI UNE RÉALLOCATION ?


Supposons capacity = 4.

Tu ajoutes un cinquième élément.

Il n’y a plus de place.

Le vector doit :
1. allouer une zone plus grande ;
2. déplacer/copier les anciens éléments ;
3. libérer l’ancienne zone.

Conséquence très importante :

Les pointeurs vers les anciens éléments peuvent devenir invalides.

Code: Select all

std::vector<int> v{1, 2, 3};

int* p = &v[0];

v.push_back(4);
v.push_back(5);

// p peut être invalide si une réallocation a eu lieu

4. reserve

Code: Select all

v.reserve(1000);
Cela dit :

"Prépare assez de capacité pour environ 1000 éléments."

Mais cela ne crée pas 1000 éléments.


5. resize

Code: Select all

v.resize(1000);
Là, le vector contient réellement 1000 éléments.

Donc :

reserve = capacité.
resize = taille logique.


6. data()

Code: Select all

int* ptr = v.data();
Les éléments d’un vector sont contigus.

C’est extrêmement utile pour les API système.

Exemple :

Code: Select all

std::vector<std::byte> buffer(4096);

ReadFile(
    file,
    buffer.data(),
    static_cast<DWORD>(buffer.size()),
    ...
);

7. std::pair

Code: Select all

std::pair<int, std::string> p{42, "hello"};
Accès :

Code: Select all

p.first
p.second
Pourquoi ?

Parfois une fonction doit retourner deux informations.

Exemple :

Code: Select all

std::pair<bool, int> parse();
bool = succès
int = valeur


8. std::optional


Supposons une recherche.

Sans optional :

Code: Select all

int find()
{
    return -1;
}
Mais que se passe-t-il si -1 est une valeur valide ?

optional rend l’absence explicite.

Code: Select all

std::optional<int> find(bool exists)
{
    if (!exists)
        return std::nullopt;

    return 42;
}
Utilisation :

Code: Select all

auto result = find(true);

if (result)
{
    std::cout << *result;
}

9. value()

Code: Select all

result.value()
Retourne la valeur si elle existe.

Si optional est vide, une exception est lancée.


À RETENIR


vector = buffer dynamique contigu.
pair = deux valeurs liées.
optional = valeur éventuellement absente.

Return to “Bases du C++”

Who is online

Users browsing this forum: No registered users and 0 guests