J'ai un vecteur dans lequel je sauvegarde des objets. J'ai besoin de le convertir en set. Je lisais sur set, mais j'ai encore quelques questions:
Comment l'initialiser correctement? Honnêtement, certains tutoriels disent qu'il est correct de l'initialiser comme set<ObjectName> something
. D'autres disent que vous avez également besoin d'un itérateur, comme set<Iterator, ObjectName> something
.
Comment les insérer correctement. Encore une fois, suffit-il d'écrire something.insert(object)
et c'est tout?
Comment obtenir un objet spécifique (par exemple object, qui contient une variable de nom égale à "ben") à partir de set?
P.S. J'ai converti le vecteur lui-même pour être comme un ensemble (a.k.a. je dois utiliser ensemble plutôt que vecteur). Seul set peut être dans mon code.
Vous ne nous avez pas beaucoup parlé de vos objets, mais supposons que vous ayez une classe comme celle-ci:
class Thing
{
public:
int n;
double x;
string name;
};
Vous voulez mettre certaines choses dans un ensemble, alors essayez ceci:
Thing A;
set<Thing> S;
S.insert(A);
Cela échoue, car les ensembles sont triés, et il n'y a aucun moyen de trier les objets, car il est impossible de comparer deux d'entre eux. Vous devez fournir soit un operator<
:
class Thing
{
public:
int n;
double x;
string name;
bool operator<(const Thing &Other) const;
};
bool Thing::operator<(const Thing &Other) const
{
return(Other.n<n);
}
...
set<Thing> S;
ou un objet fonction de comparaison:
class Thing
{
public:
int n;
double x;
string name;
};
struct ltThing
{
bool operator()(const Thing &T1, const Thing &T2) const
{
return(T1.x < T2.x);
}
};
...
set<Thing, ltThing> S;
Pour trouver la chose dont le nom est "ben", vous pouvez parcourir l'ensemble, mais il serait vraiment utile que vous nous indiquiez plus précisément ce que vous voulez faire.
Supposons que vous ayez un vecteur de chaînes, pour le convertir en jeu, vous pouvez:
std::vector<std::string> v;
std::set<std::string> s(v.begin(), v.end());
Pour les autres types, vous devez avoir operator<
défini.
Jusqu'à présent, toutes les réponses ont copié un vector
dans un set
. Puisque vous avez demandé de "convertir" un vector
en un set
, je montrerai une méthode plus optimisée qui déplace chaque élément dans un set
au lieu de les copier:
std::vector<T> v = /*...*/;
std::set<T> s(std::make_move_iterator(v.begin()),
std::make_move_iterator(v.end()));
Notez que vous avez besoin de la prise en charge de C++ 11 pour cela.
Vous pouvez initialiser un ensemble à l'aide des objets d'un vecteur de la manière suivante:
vector<T> a;
... some stuff ...
set<T> s(a.begin(), a.end());
C'est la partie facile. Maintenant, vous devez comprendre que pour avoir des éléments stockés dans un ensemble, vous devez avoir l'opérateur bool operator<(const T&a, const T& b)
surchargé. De plus, dans un ensemble, vous ne pouvez pas avoir plus d'un élément avec une valeur donnée selon la définition de l'opérateur. Donc, dans l'ensemble s
, vous ne pouvez pas avoir deux éléments pour lesquels ni operator<(a,b)
, ni operator<(b,a)
ne sont vrais. Tant que vous savez et réalisez que vous devriez être bon pour aller.
Si tout ce que vous voulez faire est de stocker les éléments que vous avez déjà dans un vecteur, dans un jeu:
std::vector<int> vec;
// fill the vector
std::set<int> myset(vec.begin(), vec.end());
Créer un ensemble, c'est comme créer un vecteur. Où vous avez
std::vector<int> my_vec;
(ou un autre type plutôt que int
) le remplace par
std::set<int> my_set;
Pour ajouter des éléments à l'ensemble, utilisez insert
:
my_set.insert(3);
my_set.insert(2);
my_set.insert(1);
Comment l'initialiser correctement?
std::set<YourType> set;
La seule condition est que YourType
doit avoir bool operator<(const YourType&) const
et être copiable (constructeur par défaut + opérateur d'affectation). Pour std::vector
, La copie est suffisante.
Comment les insérer correctement.
set.insert(my_elem);
Comment obtenir un objet spécifique (par exemple object, qui contient une variable de nom égale à "ben") à partir de set?
C'est peut-être le point. Un ensemble est juste un groupe d'objets, si vous pouvez simplement vérifier qu'un objet est à l'intérieur ou parcourir l'ensemble.