La règle générale avec des conteneurs STL est qu'ils font des copies de leur contenu. Avec C++ 11, il existe des moyens spéciaux d'éléments mobiles dans un récipient (par exemple, la fonction de membre emplace_back()
de std::vector
), mais dans votre exemple, les éléments sont char
objets, de sorte que vous allez encore copier chacun des size
char
objets.
Pensez à un std::vector
comme une enveloppe d'un pointeur vers un réseau en même temps que la longueur de la matrice. Le plus proche équivalent de « coulée d'un char *
à un std::vector<char>
» est d'échanger sur le pointeur et la longueur du vecteur par un pointeur donné et la longueur cependant la longueur est spécifiée (deux possibilités sont un pointeur vers une delà de l'élément d'extrémité ou d'une valeur size_t
). Il n'y a pas de fonction membre standard de std::vector
que vous pouvez utiliser pour échanger ses données internes avec un pointeur et une longueur donnés.
C'est pour une bonne raison, cependant. std::vector
implémente la sémantique de propriété pour chaque élément qu'il contient. Son tableau sous-jacent est alloué avec un allocateur (le deuxième paramètre de modèle), qui est std::allocator
par défaut. Si vous étiez autorisé à échanger les membres internes, vous devez vous assurer que le même ensemble de routines d'allocation de tas a été utilisé. En outre, votre implémentation STL devra fixer la méthode de stockage de la "longueur" du vecteur plutôt que de laisser ce détail non spécifié. Dans le monde de la POO, spécifier plus de détails que nécessaire est généralement désapprouvé car cela peut conduire à un couplage plus élevé.
Mais, supposons que cette fonction membre existe pour l'implémentation de la STL. Dans votre exemple, vous ne savez simplement pas comment data
a été alloué, donc vous pourriez donner par inadvertance un std::vector
un pointeur vers la mémoire de tas qui n'a pas été allouée avec l'allocateur attendu. Par exemple, data
aurait pu être alloué avec malloc
alors que le vecteur pourrait libérer la mémoire avec delete
. L'utilisation de routines d'allocation et de désallocation incompatibles conduit à un comportement indéterminé. Vous pouvez exiger que someFunction()
n'accepte que les données allouées avec une routine d'allocation particulière, mais cela spécifie à nouveau plus de détails que nécessaire.
Espérons que j'ai fait mon cas qu'une fonction membre std::vector
qui permute les membres de données internes n'est pas une bonne idée. Si vous avez vraiment besoin d'un std::vector<char>
de data
et size
, vous devez construire un avec:
std::vector<char> vec(data, data + size);
Que avez-vous besoin d'un vecteur de caractères pour? – Griwes