Contrairement à STD :: Carte et STD :: Hash_Map, versions correspondantes dans QT Ne vous soucez pas de renvoyer une référence. N'est-il pas assez inefficace, si je construis un hash pour une classe assez volumineuse? P>
surtout car il existe une valeur de méthode distincte (), qui pourrait alors le renvoyer par valeur. P>
4 Réponses :
bizarre, oui. p>
Peut-être ceci est dû à la sémantique souhaitée, où agissez par ex. Aussi, des choses comme Optimisation de la valeur de retour Nom a > peut atténuer l'impact de la performance de cette conception. P> Valeur () Code> sur une clé non spécifiée , retourne une valeur construite par défaut du type approprié. Ce n'est pas possible en utilisant des références, du moins pas aussi proprement. P>
En réalité, certaines des méthodes do em> renvoient une référence ... Par exemple, la version non constituée de Cependant, la version constante de opérateur [] code> renvoie un
t & < / code>. p>
opérateur [] code> renvoie un
const t code>. Pourquoi? Comme "se détendre" a déjà noté, la raison en laquelle on dirait avec ce qui se passe lorsque la clé n'existe pas sur la carte. Dans l'opérateur
non-const [] code>, nous pouvons ajouter la clé à la carte, puis renvoyer une référence à l'entrée nouvellement ajoutée. Cependant, l'opérateur Const
[] code> ne peut pas faire cela car il ne peut pas modifier la carte. Alors, que devrait-il renvoyer une référence? La solution consiste à rendre le const
opérateur [] code> retour
const t code>, puis renvoyer un
t code> de valeur par défaut dans le cas où la clé est pas présent sur la carte. P>
Je préférerais avoir un comportement de l'opérateur [] identique à celui de la méthode STD :: et Value () pour le renvoyer par la valeur ...
Ok, mais pourquoi ne pas const t qhash :: valeur (Const Key & Key, const T & DefaultValue) const code> renvoie une référence?
Const-Indice des opérateurs de qmap essaie d'être un peu plus accommodant, fournit une surcharge de l'opérateur de constitution constitue en tant que sucre syntaxique, fonctionne dans le problème avec des touches non existantes, essaie à nouveau d'être plus accueillante et de renvoyer une valeur construite par défaut. p>
Si vous vouliez conserver la convention de référence de retour en constons de STL, vous devez attribuer une valeur statique et renvoyer une référence à que em>. Toutefois, cela serait tout à fait en attente avec les garanties de réentrancement que Cela dit, le retour par référence n'est pas toujours le moyen le plus efficace. Si vous retournez un type fondamental ou, avec une optimisation plus agressive, lorsque L'autre raison (en plus de la pessimisation prématurée) pour préférer la référence pass-const-Référence, la tranchée, ne s'applique pas ici, car Tout cela dit, je n'utilise presque jamais l'opérateur de const-chiffre de Constère dans Qt. Oui, il a une syntaxe plus belle que pour stl code> Les conteneurs peuvent renvoyer une référence à la Const car ils ne les refusent pas les appels avec des index qui n'existent pas dans le conteneur. Le comportement dans ce cas est indéfini. Par conséquent, comme un choix de conception sage,
std :: map code> ne fournit même pas une surcharge de l'opérateur de constitution de const. P>
qmap code> fournit, la seule option consiste donc à renvoyer par la valeur. Le
const code> Il n'ya qu'un revêtement de sucre pour empêcher certaines erreurs stupides comme
constmap ["foo"] ++ code> de compilation. P>
Tailleof (t) <= Tailleof (vide *) code>, la valeur de retour indique souvent que le compilateur renvoie le résultat dans un registre directement Au lieu d'indirectement (adresse pour aboutir à un registre) ou-Heaven interdire - sur la pile. p>
std :: mappez code> et
qmap code > sont basés sur la valeur et donc homogènes. Pour un conteneur hétérogène, vous devez tenir des pointeurs et les pointeurs sont des types fondamentaux (sauf ceux intelligents, bien sûr). P>
Recherche () code> +
* IT code>, mais invariablement, vous finirez avec
compteur () code> /
Contient () Code> Appels directement devant l'opérateur de const Semecript, ce qui signifie que vous faites la recherche binaire deux fois em>. Et alors em> vous remarquerez de toute façon les différences de la valeur de retour de la valeur de retour :) p>
valeur () Const code>, je conviens que cela devrait renvoyer la référence-to-const, défaut de la valeur de référence à la valeur par défaut en tant que deuxième argument, mais je suppose que je suppose que Les développeurs QT ont estimé que c'était trop magique. P>
"MST :: Opérateur STD :: Const Swing Spoint ..." Mais std :: map code> n'a pas de
const code> Opérateur de sous-scène?
"Ils se distinguent les appels avec des index qui n'existent pas dans le conteneur" mais vous pouvez le faire sur STD :: Carte, c'est un moyen d'insérer de nouvelles valeurs. Mais même si vous vouliez dire dans l'affaire Général, comment se trouve-t-il sur le fait qu'ils ne fournissent pas d'opérateur de constitution de const?
L'une des directives de conception de la STL n'était pas de fournir des opérations qui ne sont pas possibles de manière efficace. C'est pourquoi std :: map code> n'a aucun opérateur de notamment de const-chiffre et
std :: Liste code> n'a pas du tout d'opérateur de présentation.
Bon point sur la recherche binaire deux fois i>. Mais si je sache que les éléments sont là? J'ai juste besoin de savoir ce qu'ils mappent ...
Pour toute la programmation défensive, vous ajouterez `Assert (Map.Count (X) 'de toute façon, et j'ai vu trop de logiciels expédiés avec des affirmations permettant de rejeter toute réclamation qui affirme ne sont pas critiques de performance.
@ Marcmutz-mmutz, puis-je vous demander de jeter un coup d'œil à cette question sur un autre sujet:
La documentation pour QMAP et QHASH disent spécifiquement à éviter Si vous souhaitez une référence Const, utilisez opérateur [] code> pour rechercher en raison de la raison de la marque Martin B indiquée.
const_iterator Const Key & Key) const code> où vous pouvez ensuite utiliser: p>
Dupliqué possible de Pourquoi QMAP :: opérateur [] (Const Clé & Key ) retour par valeur?
@Thomasklier Bien sûr, vient de poser 5 ans plus tôt