2011-10-01 5 views
4

Yat-il un moyen rapide (CPU) pour lancer un réseau char dans un std::vector<char>?Cast char * à std :: vecteur

Ma fonction ressemble à ceci:

void someFunction(char* data, int size) 
{ 
    // Now here I need to make the std::vector<char> 
    // using the data and size. 
} 
+3

Que avez-vous besoin d'un vecteur de caractères pour? – Griwes

Répondre

15

Vous ne pouvez pas « jeter » quoi que ce soit ici, mais vous pouvez facilement construire un vecteur de la chaîne C:

std::vector<char> v(data, data + size); 

Cela va créer un copie bien.

6

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 sizechar 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);