L'élément à l'index dans un std::set?
J'ai tombé sur ce problème: je n'arrive pas à sélectionner l'élément à l'index de la position normale std::set
. Est-ce un bug STD?
Ci-dessous un exemple simple:
#include <iostream>
#include <set>
int main()
{
std::set<int> my_set;
my_set.insert(0x4A);
my_set.insert(0x4F);
my_set.insert(0x4B);
my_set.insert(0x45);
for (std::set<int>::iterator it=my_set.begin(); it!=my_set.end(); ++it)
std::cout << ' ' << char(*it); //ups the ordering
//int x = my_set[0]; //this causes a crash!
}
Tout ce que je peux faire pour résoudre le problème?
my_set[0]
ne devrait pas compiler.- Vous poser la mauvaise question, parce que vous utilisez le mauvais conteneur. Chaque conteneur standard a été conçu avec un certain nombre d'usages dans l'esprit, et à son tour, ne pas permettre à d'autres (directement). Si, tout d'abord, vous devez identifier quelles sont les opérations que vous avez besoin et ensuite de choisir le bon conteneur
- Double Possible de Obtenir de l'élément de l'arbitraire de l'indice dans le jeu
- C'était une blague question initialement, mais les réponses s'est avéré être très utile. Si on le fait sérieusement, c'est effectivement un doublon.
Vous devez vous connecter pour publier un commentaire.
Cela ne cause pas un accident, il n'a tout simplement pas de la compilation.
set
n'a pas accès par index.Vous pouvez obtenir le n-ième élément comme ceci:
En supposant
my_set.size() > n
, bien sûr. Vous devez être conscient que cette opération prend du temps à peu près proportionnelle àn
. En C++11 il y a une jolie manière de l'écrire:Encore une fois, vous devez savoir que
n
est dans les limites de la première.my_set[0]
de retour0x4A
, c'est encore de ne pas faire ce qu'il voulait.set
est qu'ils vont voir une série de résultats surprenants, jusqu'à ce qu'ils finalement abandonner et de RTFM ;-pint x = *std::next(my_set.begin(), n-1);
.Une habitude de la mise en œuvre de std::set est d'utiliser arbres binaires, notamment auto-équilibrage des arbres binaires comme arbres rouge-noir
Ils ne vous donnent pas la constante de temps d'accès à la n-ième élément. Cependant, vous semble vouloir être le premier. Donc, essayez de C++11:
Ce n'est pas un bug dans la prévention des MST. Il n'y a pas d'accès aléatoire dans un
std::set
. Si vous avez besoin d'un accès aléatoire par un index, vous pouvez utiliserstd::vector
std::less
à l'ordre des choses.std::unordered_set
. Éditéstd::less
à moins d'avis contraire, qui, dans le cas deint
est juste une façon élégante de dire<
.Parfois, il ya une bonne raison pour avoir besoin d'un jeu, vous pouvez d'index dans. J'ai eu à mettre en œuvre cette fonctionnalité récemment à l'appui d'un héritage de l'API qui a des fonctions pour retourner le nombre d'éléments, et l'élément à un index, de sorte que l'appelant peut énumérer les éléments.
Ma manière de résoudre le problème est d'utiliser std::vector, et d'utiliser std::equal_range de trouver et d'insérer ou de supprimer des éléments dans le jeu. Par exemple, l'insertion d'un nouvel élément dans l'ensemble ressemble à ceci:
Suppression est très similaire: utilisation equal_range pour trouver l'article, et si la fourchette.la première est pas égale à la gamme.deuxièmement, supprimer cette plage.
Il n'y a aucun moyen que vous pouvez y accéder en temps constant.
Mais vous pouvez les atteindre à tout élément de O(n) fois.
E. g.
Edit: Modifié le code. Vous ne pouvez pas accéder ensemble à l'aide de l'index, mais la méthode ci-dessus serait de fournir un "indice" i si vous souhaitez copier les éléments de l'ensemble dans un tableau, si vous avez créé un tableau de taille suffisante avant de la main.