À 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;
Ajout :
Code: Select all
values.push_back(10);
values.push_back(20);
2. size ET capacity
Code: Select all
values.size()
Code: Select all
values.capacity()
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);
"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);
Donc :
reserve = capacité.
resize = taille logique.
6. data()
Code: Select all
int* ptr = v.data();
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"};
Code: Select all
p.first
p.second
Parfois une fonction doit retourner deux informations.
Exemple :
Code: Select all
std::pair<bool, int> parse();
int = valeur
8. std::optional
Supposons une recherche.
Sans optional :
Code: Select all
int find()
{
return -1;
}
optional rend l’absence explicite.
Code: Select all
std::optional<int> find(bool exists)
{
if (!exists)
return std::nullopt;
return 42;
}
Code: Select all
auto result = find(true);
if (result)
{
std::cout << *result;
}
9. value()
Code: Select all
result.value()
Si optional est vide, une exception est lancée.
À RETENIR
vector = buffer dynamique contigu.
pair = deux valeurs liées.
optional = valeur éventuellement absente.
