Use o STL Set Container em C++

Jinku Hu 12 outubro 2023
  1. Use std::set para declarar Set Container Object em C++
  2. Use a função de membro insert para inserir um elemento no conjunto em C++
  3. Use a função de membro find para recuperar o iterador do elemento com a chave fornecida em C++
  4. Use a função de membro contains para verificar se o elemento com a chave fornecida existe em um conjunto em C++
Use o STL Set Container em C++

Este artigo demonstrará vários métodos sobre como usar o contêiner STL set em C++.

Use std::set para declarar Set Container Object em C++

O comando std::set implementa um conjunto classificado de objetos únicos como um contêiner associativo. Os elementos são classificados com a função de comparação std::less por padrão, mas o usuário pode fornecer a função personalizada como o segundo argumento do modelo. O mesmo cabeçalho também fornece o contêiner std::multiset que pode armazenar os vários valores sem filtrar duplicatas.

Observe que criamos ambos os objetos de conjunto com o construtor de lista de inicializadores no exemplo a seguir. Também utilizamos a função de membro count, que recupera o número de elementos que existem no conjunto com a chave fornecida. Esta função é mais intrínseca ao contêiner std::multiset, mas você pode verificar se o elemento existe com a mesma função quando invocado a partir do 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;
}

Resultado:

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

Use a função de membro insert para inserir um elemento no conjunto em C++

A função insert tem múltiplas sobrecargas, mas utilizamos a versão que leva um único argumento que representa o elemento a ser adicionado ao conjunto. Esta sobrecarga de insert retorna o objeto std::pair do iterador e o bool.

O último indica se a inserção foi bem-sucedida e, em caso afirmativo, tem um valor true. Por outro lado, o iterador aponta para o elemento inserido quando a operação é bem-sucedida. Se falhar, ele aponta para o elemento que impediu a inserção. Observe que a operação de inserção tem complexidade logarítmica no tamanho do contêiner.

#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;
}

Resultado:

Inserted !Not inserted !

Use a função de membro find para recuperar o iterador do elemento com a chave fornecida em C++

A função find é outra função membro útil do contêiner std::set que pode retornar o iterador para o elemento com a chave fornecida. Se não houver tal elemento no conjunto, o iterador passado é retornado; isso ajuda o usuário a verificar a chamada de função bem-sucedida.

#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;
}

Resultado:

Found 2

Use a função de membro contains para verificar se o elemento com a chave fornecida existe em um conjunto em C++

Como o padrão de linguagem C++ 20, std::set fornece a função de membro, contains, que é a interface mais simples para verificar se o elemento com a chave fornecida existe no objeto definido. A função retorna o valor booleano para indicar se tal elemento está presente no conjunto. A complexidade do tempo de execução desta função também é logarítmica no tamanho do contêiner.

#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;
}

Resultado:

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

Artigo relacionado - C++ Set