web-dev-qa-db-fra.com

Comment convertir un vecteur en set?

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.

37
Marius

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.

5
Beta

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.

109
deepmax

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.

43
David

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.

12
Ivaylo Strandjev

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());
7
Zac Howland

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);
1
Pete Becker

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.

1
Johan