C++ taille de vecteur types
J'ai juste commencé à apprendre le C++ et avez une question sur les vecteurs.
Le livre que je suis en train de lire les états que si je veux extraire de la taille d'un vecteur de type double (par exemple), je dois faire quelque chose comme:
vector<double>::size_type vector_size;
vector_size = myVector.size();
Alors qu'en Java je pourrais faire
int vector_size;
vector_size = myVector.size();
Ma question est, pourquoi est-il un type nommé vecteur::size_type? Pourquoi ne pas en C++, il suffit d'utiliser l'int?
Il y a des réponses à cette question http://stackoverflow.com/q/131803/72178.
En C++11, vous pouvez dire
Ce n'est pas bon si vous êtes l'initialisation
Je ne comprends pas votre opposition. Si
Si vous avez
En C++11, vous pouvez dire
auto vector_size = myVector.size();
et de s'inquiéter un peu moins 😉Ce n'est pas bon si vous êtes l'initialisation
vector_size
à 0
mais vous avez l'intention de l'utiliser comme un vector<double>::size_type
.Je ne comprends pas votre opposition. Si
myVector
est de type std::vector<double>
, et que vous écrivez auto vector_size = myVector.size();
puis vector_size
est de type std::vector<double>::size_type
, peu importe si le vecteur est vide ou pas. Veuillez préciser.Si vous avez
for(std::vector<double>::size_type i=0; i<myVector.size(); i++)
puis l'auto ne peut pas être utilisé pour déclarer i
.OriginalL'auteur | 2011-10-03
Vous devez vous connecter pour publier un commentaire.
C++ est un langage pour la bibliothèque de l'écriture*, et permettant à l'auteur d'être aussi général que possible, est l'un de ses principaux points forts. Plutôt que de prescrire les conteneurs standard pour l'utilisation de tout type de données particulier, l'approche plus générale est de décréter que chaque conteneur exposer un
size_type
type de membre. Cela permet une plus grande flexibilité et genericity. Considérons, par exemple, ce code générique:Ce code fonctionne sur tout conteneur de modèle (qui peut être instancié avec un seul argument), et on n'impose pas les restrictions inutiles à l'utilisateur de notre code.
(Dans la pratique, la taille de la plupart des types de résoudre à
std::size_t
, qui à son tour est un type non signé, généralementunsigned int
ouunsigned long
-- mais pourquoi devrions-nous le savoir?)*) je ne suis pas sûr de ce que la déclaration correspondante de Java devrait être.
* Un ami m'a dit une fois que Java est un langage de babouin codeurs, mais je n'ai pas assez d'expérience pour confirmer ou infirmer cette affirmation. 😛
Sauf si vous êtes sur un système 64 bits où
std::size_t
est probablement une version 64 bits de type.c'est vrai. Nous devrions peut-être déterrer quelques-uns de la commune typedefs, de la curiosité.
OriginalL'auteur
Java ne dispose pas d'entier non signé de types, de sorte qu'ils ont à vivre avec
int
.Au contraire, en C++ et utilise, le cas échéant (où les valeurs négatives sont absurdes), l'exemple canonique étant la longueur de quelque chose comme un tableau.
size_t
, plutôt que deint
, c'est parce que sur certaines machines plus petites,int
n'aurait pas été assez grand (et valong
aurait enregistré une perte de performance). L'utilisation d'un type non signé, ici, est généralement reconnu comme un défaut, car non signé types en C et C++ de travail dans un peu de drôles de manières. (En gros, une expression commeabs(i1 - i2)
correctement donner la distance entre deux types d'index. Il n'est pas sii1
oui2
ne sont pas signés.)OriginalL'auteur
La norme C++ dit qu'un conteneur
size_type
est un unsigned type intégral, mais il ne précise pas lequel; une mise en œuvre peut utiliserunsigned int
, et l'on pourrait utiliserunsigned long
, par exemple.C++ n'est pas "blindé" à partir d'une plate-forme spécifique détails de mise en œuvre autant que Java est. Le
size_type
alias permet de bouclier votre code de ces détails, donc ça va fonctionner correctement indépendamment de ce type réel doit être utilisé pour représenter un vecteur de taille.OriginalL'auteur
Mon sentiment personnel est que c'est pour un meilleur code de la sécurité/des raisons de lisibilité.
Pour moi
int
est un type qui ne véhicule aucune signification particulière: il peut y avoir des pommes, des bananes, ou quoi que ce soit.size_type
, ce qui est probablement untypedef
poursize_t
a une forte signification: elle indique la taille, en octets.Qui est, il est plus facile de savoir ce qu'est une variable veux dire. Bien sûr, à la suite de ce raisonnement, il pourrait y avoir beaucoup de différents types pour différentes unités. Mais un "taille de la mémoire tampon" est vraiment un cas commun de sorte qu'il mérite en quelque sorte un dédié de type.
Un autre aspect est le code maintability: si le contenant change soudainement d'
size_type
de dire,uint64_t
àunsigned int
par exemple, à l'aide desize_type
vous n'avez pas à changer dans tous les code source de compter sur elle.OriginalL'auteur
Le livre que vous êtes en train de lire affirme que si vous voulez extraire la taille d'un vecteur de type double (par exemple), vous devriez faire quelque chose comme:
Alors qu'en Java, vous pouvez faire
Les deux sont inférieures options en C++. La première est extrêmement détaillé et dangereux (surtout à cause de l'implicite promotions). La deuxième est détaillé et extrêmement dangereux (en raison du nombre de gamme).
En C++, ne
Noter que
ptrdiff_t
, à partir de lastddef.h
- tête, est un type signé qui est garantie suffisante.L'initialisation est faite dans la déclaration (c'est mieux de style C++).
La même convention de nommage a été appliquée à deux variables.
En résumé, faire la bonne chose, c'est plus court et plus sûr.
Cheers & hth.,
À moins qu'ils n', il fixe en C++11,
ptrdiff_t
est pas la garantie d'être assez grand. Il est possible d'avoir des objets dont la taille ne peut pas être représenté dans unptrdiff_t
.il n'y a pas assez de place ici pour discuter de la façon dont un tableau de
char
peut-être trop grande dans un de 16 bits de l'adresse de l'espace. la réponse pour un 3 GiB tableau dechar
dans l'espace d'adressage 32 bits, c'est qu'il n'est pas pris en charge par la norme (ptrdiff_t
est nécessaire pour être assez grand), afin de traiter spécialement si vous devez avoir de la bête. Personnellement, je n'ai jamais rencontré le 3 GiB tableau dechar
. 🙂Je n'ai jamais eu besoin de 3 GiB tableau de
char
soit, mais j'ai utilisé 32 bits implémentations qui les appuient (Sun CC sous Solaris, g++ sous Linux sur un 32 bits, PC). Le C standard certainement permet pointeur de la soustraction à débordement (résultant en un comportement indéfini), et autant que je sache, la norme C++ juste passe la balle à la norme ici.il me semble être un différend entre 5.7 et 18.2 en C++11. 5.7 dit que le dépassement est possible, 18.2 dit que
ptrdiff_t
"peut contenir la différence de deux indices dans un tableau d'objet, comme décrit dans de 5,7". Ceci est différent du texte en C89/C99, qui dit tout simplement queptrdiff_t
est le type du résultat de pointeur de la soustraction, pas que elle peut, en général, de conserver la valeur. Il lit à moi, comme si celui qui a écrit ça m'attendais à la question à résoudre dans C++11, mais il y a toujours une différence dans la langue entre 18.2/6 (assez grand pour aucun de l'objet) et /5 ( array object).OriginalL'auteur