Comment bon marché affecter C-gamme de style à std::vector?
Actuellement je ne les suivants:
//float *c_array = new float[1024];
void Foo::foo(float *c_array, size_t c_array_size) {
//std::vector<float> cpp_array;
cpp_array.assign(c_array, c_array + c_array_size);
delete [] c_array;
}
Comment puis-je optimiser cette affectation? Je voudrais de ne pas effectuer elementwise copie, mais juste changer les pointeurs.
Avec ou sans l'aide de C++0x?
Sans. Mais le C++0x méthode serait également agréable à voir.
Ce n'est pas réellement une double question. La question liée uniquement les adresses allant de vecteur de tableau, pas de tableau de vecteur.
En effet. Liés question a été modifié pour inclure, mais qui a été près d'un an après la première demande, et aucune des réponses de l'adresse de cette partie de la question.
Une mise à jour pour 2018?
Sans. Mais le C++0x méthode serait également agréable à voir.
Ce n'est pas réellement une double question. La question liée uniquement les adresses allant de vecteur de tableau, pas de tableau de vecteur.
En effet. Liés question a été modifié pour inclure, mais qui a été près d'un an après la première demande, et aucune des réponses de l'adresse de cette partie de la question.
Une mise à jour pour 2018?
OriginalL'auteur Dmitriy | 2011-04-29
Vous devez vous connecter pour publier un commentaire.
L'actuel
std::vector
ne permet pas d'interface ou de prendre possession d'précédemment de stockage alloué. Sans doute il serait trop facile de passer d'une pile, l'adresse dans un accident, laissant ainsi plus de problèmes que de solutions.Si vous voulez éviter de copier dans un vecteur, vous devrez soit utiliser des vecteurs à travers l'ensemble de votre chaîne d'appel, ou faire comme en C avec
float[]
tout le temps. Vous ne pouvez pas les mélanger. Vous peut garanti que&vec[0]
sera équivalente à la C-tableau bien, entièrement contigus, l'utilisation d'un vecteur dans l'ensemble du programme peut être faisable.OriginalL'auteur Mark B
Actuellement, le
std::vector
interface ne possède pas la capacité de se déplacer à partir ou swap avec tout, sauf à un autrestd::vector
.I
il ne nécessite pas de tenue de livres supplémentaires, vraiment, si le vecteur prend possession de la mémoire. Mais il y a tant de nombreuses façons, par exemple, une fonction peut être utilisée de mal, je suis sûr que votre évaluation de la probabilité est exacte.
OriginalL'auteur Puppy
La seule façon de le faire serait de créer un allocateur personnalisé.
Écrire un allocateur de classe que vous pouvez initialiser avec votre ensemble.
Instancier le vecteur avec l'allocateur comme un argument.
Pouvez-vous veuillez donner un exemple de comment cela est possible?
Je vais devoir creuser un manuel. Je n'ai pas écrit un allocateur personnalisé pour les âges. Je ne suis pas sûr si je peux contourner le problème que Dennis points. Peut-être pas, mais je vais essayer de trouver le temps de regarder un peu de temps bientôt.
OriginalL'auteur Michael J
Peu probable, il est possible - c'est très dangereux, parce que std::vector ne sait pas comment la mémoire a été allouée, et comment il doit être libéré.
Si c'est possible, vous pouvez remplacer l'allocation initiale avec la création de std::vector de taille correcte. Il utilise zone mémoire contiguë, de sorte qu'il peut remplacer manuellement la mémoire tampon allouée.
OriginalL'auteur maxim1000