2010-02-16 3 views
0

Juste comme titre. Au moins, je sais que le tableau n'est peut-être pas celui que je veux. cus J'ai besoin de générer un index aléatoire avant de vouloir récupérer un élément du tableau de façon aléatoire. Pour ton opinionquel conteneur stl je devrais choisir Si j'ai besoin d'obtenir au hasard un élément du conteneur

J'ai changer le titre de ma question « quel contenant stl je choisir si je dois hasard obtenir un élément du conteneur ». ce que je trouve vraiment est un cotain, disons C, et ce conteneur devrait avoir une méthode, disons, get_ramdom_member(), ce qui m'aidera à obtenir un élément au hasard dans le conteneur C sans fournir de clé.

@binary: ce que je stocke dans le conteneur est effectivement prise fd. l'autre côté de la socket est un "nœud erlang". plusieurs erlang node togerther sert de cluster. Donc, je stocke tous les fds socket vers ce cluster dans un conteneur. Chaque fois que j'ai besoin de parler au cluster, j'ai besoin de choisir un fd. Dans le but de partager la charge, j'ai besoin d'en obtenir un au hasard. Je ne peux pas vous dire exactement le nombre de fd que le conteneur doit maintenir, mais actuellement il est inférieur à 10 pour le moment. mais qui sait si le nombre sera 1000 un jour plus tard.

+1

Pouvez-vous nous donner plus d'informations sur ce que vous essayez d'atteindre? par exemple. combien d'articles, et pourquoi en choisir un au hasard? Il est vraiment difficile de donner des conseils avec la quantité de données que vous nous avez donnée. Merci. –

+0

dépend, par votre explication, le vecteur serait assez bon! –

+0

L'attribution aléatoire du partage de charge n'est probablement pas une bonne idée. –

Répondre

5

D'après les informations que vous avez fournies, ce qui est peu, la réponse évidente est std::vector. Cela vous donnera un accès aléatoire aux éléments. La bonne chose à propos des conteneurs standard est que vous pouvez changer entre eux avec relativement peu d'effort, donc si le vecteur ne fonctionne pas, vous pouvez probablement passer à un autre conteneur sans réécrire tout votre code.

Si vous voulez simplement randomiser le contenu du récipient, voir std::random_shuffle.

1

Nous avons besoin plus d'informations vraiment, mais il semble que vous avez juste besoin d'un std::vector. C'est un bon choix pour l'accès aléatoire par index.

-1

Vous pouvez toujours placer un tableau dans une classe qui vérifie les limites lors de l'affectation et augmente pour s'adapter aux nouveaux éléments de façon transparente. Bien que, vous mentionnez vouloir choisir un index aléatoire dans le tableau - ceci suppose que vous avez déjà rempli le tableau avec quelque chose et à ce point vous ne parlez plus d'accéder à un index qui n'existe pas et std::vector fonctionnerait très bien.

pour répondre à tous de votre [dit] besoins que vous pouvez toujours utiliser un std::map<int,Thing>. Il vous permet de faire un find pour rechercher des éléments et l'opérateur [] agit comme vous le souhaitez avec un tableau pour les éléments qui existent.

+0

"Vous pouvez toujours placer un tableau dans une classe qui vérifie les limites lors de l'affectation" - vous voulez dire que std :: vector utilise at()? –

+0

À droite, mais le comportement par défaut de 'lancer une instance de 'std :: out_of_range'' n'est probablement pas suffisant dans la plupart des cas. J'ai mis à jour pour être plus précis – ezpz

0

Si vous voulez un élément aléatoire et le rendre facile sur vous-même. Chargez un std::queue appel std::random_shuffle et puis cliquez sur les éléments jusqu'à ce que votre contenu de cœur.

+0

Vous ne pouvez pas utiliser random_shuffle sur une file d'attente std :: –

+0

Vous ne pouvez pas? D'accord, faites-en un 'std :: deque' (comme c'est ce qui sous-tend une file d'attente) et faites ressortir les éléments jusqu'à ce que vous ayez du contenu. –

Questions connexes