DMarlon Studio

Lección 11 · 11 de 20

Trabajar con vectores · C++

Modifique un std::vector en C++ con insert, erase y pop_back, y ordénelo y busque su mínimo y su máximo con las funciones de <algorithm>.

C++ · Trabajar con vectores en DMarlon Studio: el código del ejemplo y su salida en la terminal

Además de push_back, `insert()` añade en cualquier sitio. Recibe la posición como iterador: list.begin() señala el primer elemento y list.begin() + 2, el tercero. Así coffee entra al principio y butter, delante de la posición 2.

`erase()` borra el elemento de una posición (aquí milk, el segundo) y `pop_back()` quita el último. Los demás se desplazan y size() se actualiza: de 6 elementos se pasa a 4.

`std::sort`, de <algorithm>, ordena un rango que va de begin() a end(), la posición justo después del último. Con cadenas, el orden es alfabético.

<algorithm> tiene muchas más funciones que trabajan con rangos: `std::min_element` y `std::max_element` devuelven un iterador al menor y al mayor, y el * de delante obtiene su valor. Con un tercer argumento, std::greater<int>() (de <functional>), sort ordena de mayor a menor, como una tabla de récords.

`clear()` vacía el vector y `empty()` dice si se ha quedado sin elementos.

Código · main.cpp

#include <algorithm>#include <functional>#include <iostream>#include <string>#include <vector>int main() {    std::vector<std::string> list = {"milk", "bread", "eggs"};    list.push_back("apples");                 // at the end    list.insert(list.begin(), "coffee");      // at the start    list.insert(list.begin() + 2, "butter");  // before position 2    for (auto item : list) std::cout << item << ' ';    std::cout << "(" << list.size() << " items)\n";    // erase removes by position (here, the second item); pop_back, the last one.    list.erase(list.begin() + 1);    list.pop_back();    // sort from <algorithm> puts a range in order: begin() to end().    std::sort(list.begin(), list.end());    for (auto item : list) std::cout << item << ' ';    std::cout << "(" << list.size() << " items)\n";    // Game scores: lowest, highest and a top list from high to low.    std::vector<int> scores = {450, 120, 899, 75, 300};    std::cout << "Lowest: " << *std::min_element(scores.begin(), scores.end())              << ", highest: " << *std::max_element(scores.begin(), scores.end()) << '\n';    std::sort(scores.begin(), scores.end(), std::greater<int>());    for (int s : scores) std::cout << s << ' ';    list.clear();    std::cout << "\nList empty? " << std::boolalpha << list.empty() << '\n';    return 0;}

Salida · c++ -std=c++17 main.cpp -o main && ./main

coffee milk butter bread eggs apples (6 items)
bread butter coffee eggs (4 items)
Lowest: 75, highest: 899
899 450 300 120 75 
List empty? true

Para recordar

  • v.begin() es la primera posición y v.end(), la siguiente a la última.
  • insert(v.begin() + i, x) añade delante de la posición i.
  • erase(v.begin() + i) borra la posición i; pop_back(), la última.
  • std::sort(v.begin(), v.end()) ordena de menor a mayor.
  • std::min_element y std::max_element buscan los extremos.

Ejercicio

Antes de borrar un producto, búsquelo con std::find(list.begin(), list.end(), "eggs"): si el resultado es list.end(), escriba que no está en la lista; si no, bórrelo con erase.