Use o STL Set Container em C++
-
Use
std::set
para declarar Set Container Object em C++ -
Use a função de membro
insert
para inserir um elemento no conjunto em C++ -
Use a função de membro
find
para recuperar o iterador do elemento com a chave fornecida em C++ -
Use a função de membro
contains
para verificar se o elemento com a chave fornecida existe em um conjunto 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
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