Quel est le moyen le plus court, my_set.insert("Apples");
my_set.insert("apples"); //Insert doesn't occur because of duplicate item
3 Réponses :
La définition de si vous fournissez Ceci est un exemple simple, la chaîne nonOrded_set code> est
Et comme de côté, vous pouvez faire la même chose sur la classe Code> Set Code> avec le fonctionnement qu'il utilise pour comparer les valeurs.
Bien que vous deviez coller à tolower code> ou
toupper code> dans les deux
myhash code> et
myequal code> parce qu'ils ne sont pas toujours transistifs. Mieux encore, c'est utiliser le pliage de cas approprié décrit dans la spécification Unicode.
Le problème avec c'est la valeur n'est pas insensible à la casse. Si vous iTerez-vous à travers l'ensemble, il retournera «Apple» ou «Apple»?
@Lokiastari tout ce qui est mis en premier? Le second insérer code> échouerait.
@ Unixman83: le deuxième insert n'a pas échoué (l'échec indique une erreur). Il ne change tout simplement pas l'ensemble (tel que défini par le PRD). Donc, ce n'est pas irréalisable (même si je pense qu'il est peu probable) pour une implémentation qui écrase l'original (première valeur).
@dalle j'ai modifié ma réponse à utiliser tolower code> tout au long de l'emploi et il semble que STD :: EMPAL serait également un mandat et une comparaison de taille en premier
@Lokiastari: EN.CPPREFERFERATION.COM/W/CPP/Container/unordered_set/insert "renvoie une paire constituée d'un BOOL indiquant si l'insertion a eu lieu et un itérateur à l'élément inséré"
@dalle: S'il vous plaît ne citez pas ce site sur moi (c'est horrible et possède beaucoup d'inexactitudes et d'opinion des développeurs (qui ne sont pas toujours correctes)). Ce que vous voulez, c'est N3242 23.2.4 Contenants associatifs [associatier.reqmts] code> où vous trouverez
Tableau 103 - Configuration de conteneurs associatifs non ordonnée (en plus du conteneur) code>. Si vous n'avez pas de copie de la norme, obtenez-en un: Stackoverflow.com/a/4653479/14065
@Lokiastari: Bon, alors vous pouvez le lire vous-même. "Retours: Le composant bool de l'objet paire retourné indique si l'insertion a eu lieu et que le composant itérateur pointe sur l'élément avec une clé équivalente à la clé de Value_Type (Obj)."
@Lokiastari: et la table que vous parlez des Etats "Effets: insère T Si et uniquement s'il n'y a pas d'élément dans le conteneur avec une clé équivalente à la clé de t. Le composant bool de la paire retournée indique si l'insertion a lieu, que ce soit. et le composant itérateur pointe sur l'élément avec une clé équivalente à la clé de t. " qui répond à votre propre question.
@dalle: Oui. J'avais indiqué que vous étiez correct. Juste en utilisant une source de merde.
J'aime mieux ça.
fonctionne sur Linux. p>
Mieux que quoi? Ce n'est pas une réponse! N'est-ce pas juste une version reformulée de la réponse de Parapura? Complètement obsolète! Quel est strcasecmp code>? Et créez-vous vraiment une nouvelle chaîne chaque fois que la fonction Hash est appelée?
Strcasecmpmp CODE> est standard dans la bibliothèque GLIBC C de Linux (voir
stricmp code>).
Personnellement, je définirais un type de valeur qui était insensible à la casse et qui se transforme dans une chaîne au mérite indiqué. Nous permettant ainsi d'utiliser les modèles de hachage et de prédicat standard.
class LCStringOriginalPreserved { std::string original; std::string data; public: operator std::string&() {return data;} operator std::string const&() const {return data;} std::string& getOriginal() {return original;} LCString(char const* init) : original(init) { std::transform(original.begin(), original.end(), std::back_inserter(data), &::tolower); } };
C'est une bonne idée, mais si j'ai besoin de préservation de cas / comportement insensible au cas. Cela ne préserve pas le cas.
@ Unixman83: Si vous allez: data.inserser ("Apple"); Data.insert ("Apple"); Code> Quelle version attendez-vous à être dans l'ensemble? Vous ne pouvez plus que la préservation de casse comme aléatoire sera perdue. Donc, le concept de cas de préservation d'un cas insensible à cas n'a pas de sens. Maintenant, si vous aviez dit ONUORKEDED_MULTINISTET qui aurait eu de sens. Mais ce qui précède est facilement étendu. Il suffit d'ajouter un autre champ à LCstring pour stocker la valeur d'origine afin que vous puissiez la récupérer explicitement.
Je m'attends à ce que le premier que j'ai inséré b> soit dans l'ensemble, celui avec le cas souhaité.
@ Unixman83: C'est ce que vous allez probablement entrer dans la plupart des situations, mais il n'ya rien dans la norme qui garantira qu'avec n'importe quoi présentée ici. Fournir cette garantie, vous saurez à travers quelques cerceaux supplémentaires. Mais comme je l'ai dit auparavant, cette exigence n'a pas de sens.
@Lokiastari hein? S'il utilise simplement un comparateur insensible à une casse, il est guarantie d'avoir la première insertion dans l'ensemble, car la seconde n'entraîne rien, car bien, c'est déjà dans l'ensemble. Comportement parfaitement défini standard.
@Christianrau: Ok je l'ai regardé, oui c'est le comportement (bien que je ne pense pas qu'il soit évident qu'il soit défini comme ça et que je pouvais voir les implémentations définir une insertion en termes d'opérateur []). Mais je suis content que cela soit défini comme ça. N3242 23.2.4 Conteneurs associatifs [associatif.reqmts] code>
Avez-vous essayé de le hériter et de remplacer les méthodes d'ajout et d'obtenir des éléments?
@Davogotland, les conteneurs STL ne sont pas conçus pour l'héritage.