Utilice el contenedor de conjuntos STL en C++

Jinku Hu 12 octubre 2023
  1. Utilice std::set para declarar un objeto contenedor de conjunto en C++
  2. Utilice la función miembro insert para insertar un elemento en un conjunto en C++
  3. Utilice la función de miembro find para recuperar el iterador del elemento con la clave dada en C++
  4. Utilice la función de miembro contains para comprobar si el elemento con la clave dada existe en un conjunto en C++
Utilice el contenedor de conjuntos STL en C++

Este artículo demostrará varios métodos sobre cómo utilizar el contenedor STL set en C++.

Utilice std::set para declarar un objeto contenedor de conjunto en C++

El comando std::set implementa un conjunto ordenado de objetos únicos como un contenedor asociativo. Los elementos se ordenan con la función de comparación std::less de forma predeterminada, pero el usuario puede proporcionar la función personalizada como segundo argumento de plantilla. El mismo encabezado también proporciona el contenedor std::multiset que puede almacenar los valores múltiples sin filtrar los duplicados.

Tenga en cuenta que creamos ambos objetos de conjunto con el constructor de la lista de inicializadores en el siguiente ejemplo. También utilizamos la función miembro count, que recupera el número de elementos que existen en el conjunto con la clave dada. Esta función es más intrínseca al contenedor std::multiset, pero puede comprobar si el elemento existe con la misma función cuando se invoca desde el objeto std::set.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

template <typename T>
void printSet(set<T> s) {
  for (const auto &item : s) {
    cout << item << "; ";
  }
  cout << endl;
}

template <typename T>
void printMultiSet(multiset<T> s) {
  for (const auto &item : s) {
    cout << item << "; ";
  }
  cout << endl;
}

#define STR(num) #num

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};
  printSet(s1);

  std::multiset<int> s2 = {1, 1, 1, 2, 2, 3};
  printMultiSet(s2);
  std::cout << STR(s2) << " contains " << s2.count(1) << "ones" << endl;
  std::cout << STR(s2) << " contains " << s2.count(2) << "twos" << endl;

  return EXIT_SUCCESS;
}

Producción :

1; 2; 3;
1; 1; 1; 2; 2; 3;
s2 contains 3 ones
s2 contains 2 twos

Utilice la función miembro insert para insertar un elemento en un conjunto en C++

La función insert tiene múltiples sobrecargas, pero utilizamos la versión que toma un solo argumento que representa el elemento que se agregará al conjunto. Esta sobrecarga de insert devuelve el objeto std::par del iterador y el bool.

Este último indica si la inserción se realizó correctamente y, en caso afirmativo, tiene un valor true. Por otro lado, el iterador apunta al elemento insertado cuando la operación tiene éxito. Si falla, apunta al elemento que impidió la inserción. Tenga en cuenta que la operación de inserción tiene una complejidad logarítmica en el tamaño del contenedor.

#include <cassert>
#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};

  auto ret = s1.insert(5);
  assert(*ret.first == 5);
  if (ret.second) std::cout << "Inserted!" << endl;

  ret = s1.insert(1);
  assert(*ret.first == 1);
  if (!ret.second) std::cout << "Not inserted!" << endl;

  return EXIT_SUCCESS;
}

Producción :

Inserted!
Not inserted!

Utilice la función de miembro find para recuperar el iterador del elemento con la clave dada en C++

La función find es otra función miembro útil del contenedor std::set que puede devolver el iterador al elemento con la clave dada. Si no hay tal elemento en el conjunto, se devuelve el iterador pasado al final; esto ayuda al usuario a verificar que la llamada a la función se haya realizado correctamente.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};

  auto search = s1.find(2);
  if (search != s1.end()) {
    cout << "Found " << (*search) << endl;
  } else {
    cout << "Not found" << endl;
  }

  return EXIT_SUCCESS;
}

Producción :

Found 2

Utilice la función de miembro contains para comprobar si el elemento con la clave dada existe en un conjunto en C++

Desde el estándar del lenguaje C++ 20, std::set proporciona la función miembro, contains, que es la interfaz más sencilla para comprobar si el elemento con la clave dada existe en el objeto set. La función devuelve el valor booleano para indicar si dicho elemento está presente en el conjunto. La complejidad del tiempo de ejecución de esta función también es logarítmica en el tamaño del contenedor.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s3 = {91, 123, 63, 122, 22, 53};

  for (int x : {22, 23, 53, 54}) {
    if (s3.contains(x)) {
      cout << x << ": Found\n";
    } else {
      cout << x << ": Not found\n";
    }
  }

  return EXIT_SUCCESS;
}

Producción :

22: Found
23: Not found
53: Found
54: Not found
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Set