de l'index ou de la position dans std::set
J'ai un std::set de std::string. J'ai besoin de la "index" ou "position" de chaque chaîne dans le jeu, est-ce un véritable concept dans le contexte?
Je suppose que find() retourne un itérateur à la chaîne, donc ma question est peut-être mieux exprimé ainsi : "Comment puis-je convertir un itérateur pour un certain nombre?".
- stackoverflow.com/questions/1796503/index-or-position-in-stdset/... @seh si nous voyons un point de vue sémantique, ce que vous avez dit est correct, Mais les décors sont commandés. Ils sont généralement mis en œuvre en utilisant une certaine forme d'Équilibre des arbres comme le rouge noir de l'arbre, et l'utilisation stricte de la faiblesse de la commande à l'ordre les éléments de l'ensemble. Je ne sais pas si la norme mandats cet ordre ou pas. Mais c'est la façon dont il est
- Vous pouvez envisager d'utiliser un vecteur trié plutôt que d'un ensemble. Plutôt que d'utiliser find(), vous obtenez la performance de la recherche binaire avec
LB = std::lower_bound(v.begin(),v.end(),value)
=> un itérateur vers le premier élément >=value
, etindex = LB - v.begin()
est l'indice de cet élément, ce qui peut être égale àvalue
ou plus, sivalue
n'est pas dans le vecteur trié.
Vous devez vous connecter pour publier un commentaire.
std::distance
est ce que vous avez besoin. Vous voulez, je suppose questd::distance(set.begin(), find_result)
std::distance
est O(n) puisqueset
les itérateurs sont des modèles deBidirectionalIterator
et pasRandomAccessIterator
Je ne pense pas que c'est significatif - de l'ensemble sont "auto incrustée" et triées ainsi, l '"indice" serait invalidé lorsque le jeu est modifié.
Bien sûr, cela dépend de la manière dont vous souhaitez utiliser l'index et si l'ensemble est essentiellement statique (un dictionnaire).
En dépit de ce que les autres ont écrit ici, je ne pense pas que "index" ou "position" a de sens que par rapport à un ensemble. En termes mathématiques, un ensemble n'expose qu'à ses membres et peut-être sa cardinalité. Le sens des opérations impliquent de tester si un élément est un membre de l'ensemble, et en les combinant ou en soustrayant des ensembles pour produire de nouvelles séries.
Certaines personnes parler de jeux de que les structures de données en perdant termes, par des facettes de l'être "commandé" ou "non ordonnée", et si elles permettent de reproduire ou de faire respecter l'unicité. L'ancien facette distingue un tableau avec une O(n) insertion de la garde, où une tentative d'insérer un élément balaye d'abord les membres existants pour voir si le nouvel élément existe et, si non, insère le nouvel élément à la fin, et d'une table de hachage, qui pourrait les conserver afin qu'au sein d'un segment de la chaîne. Un arbre Rouge-Noir Arbre utilisé par
std::set
est quelque part entre les deux; sa traversée de l'ordre est déterministe à l'égard de la faible stricte de commande imposées par le comparateur de prédicat, mais, à la différence du tableau esquissé ci-dessus, il ne conserve pas ordre d'insertion.L'autre facette — savoir si le jeu permet de dupliquer des éléments — est dénuée de sens en mathématiques, et plus précisément décrit comme une sac. Une telle structure reconnaît la différence entre l'identité et de valeur "de la monotonie."
Problème peut impliquer soucier de la position de certains; il n'est pas clair de quelle position, mais je pense que vous allez avoir besoin de quelques données de structure distincte de
std::set
pour modéliser correctement. Peut-être unstd::map
cartographie de votre ensemble d'éléments pour chaque position de le faire. Qui ne garantirait pas que les positions sont uniques.Il peut également aider à clarifier le problème à penser à comment vous auriez du modèle comme relations, comme dans une base de données relationnelle. Ce que comprend la clé? Quelles portions de les entités peuvent varier de manière indépendante?