2012-10-12 12 views
14

Powiel możliwe:
How to convert vector to array C++Najszybszym sposobem na skopiowanie zawartości wektora do tablicy?

Podczas pracy z tablicami masz możliwość korzystania

memcpy(void *destination, const void *source, size_t num); 

Jednakże wektory wystarczy podać iteratorów dla metody kopiowania, czyniąc memcpy bezużyteczną . Jaka jest najszybsza metoda kopiowania zawartości wektora do innej lokalizacji?

+11

W C++, ** zawsze ** używaj 'std :: copy' zamiast' memcpy' (ten pierwszy przekaże to drugie, gdy po ssible). – ildjarn

+1

Nie wiem, jak szybko jest, ale można użyć 'std :: copy'. –

+1

Myślę, że najbardziej oczywista odpowiedź brzmi: _Dlaczego (myślisz) musisz skopiować z wektora do tablicy? _ Wektor _jest_ tablicą i może być używany jako taki. Jako efekt uboczny, _no copying all all jest z pewnością najszybszą możliwą operacją kopiowania. – sbi

Odpowiedz

31

std::copy, ręce w dół. Jest mocno zoptymalizowany, aby używać najlepszej dostępnej metody wewnętrznie. Jest to całkowicie zgodne z memcpy. Nie ma powodu, aby używać memcpy, nawet podczas kopiowania między tablicami w stylu C lub buforami pamięci.

3

Można używać memcpy wektorem - wektory są gwarantowane być ciągłe w pamięci, pod warunkiem, że wektor nie jest pusty, można użyć &vData[0] (gdzie vData to wektor) jako wskaźnik źródłowego memcpy

EDYCJA Jak wspomniano w komentarzach do innych odpowiedzi, działa to tylko wtedy, gdy typ wartości wektora jest trywialnie kopiowalny.

+2

-1 z tego samego powodu, o którym mówi ildjarn pod odpowiedzią osoby. –

+1

@lidjarn OK fair - nie wiedziałem o tym i jestem pewien, że muszą istnieć inne, które tego nie robią, więc właściwie nie usunę tej odpowiedzi. – mathematician1975

11

Będziesz musiał zmierzyć to dla siebie, w swoim otoczeniu, ze swoim programem. Każda inna odpowiedź będzie miała zbyt wiele zastrzeżeń.

Mimo to zrobić, tutaj jest jeden sposób można porównać z:

std::copy(source.begin(), source.end(), destination); 
5

Spróbuj tego: -

std::vector<int> newvector(oldvector); 

przypadku kopiowania w tablicy spróbuj tego: -

std::copy(source.begin(), source.end(), destination); 
+2

-1. Asker chce tablicy, a nie nowego wektora. –

+0

Przepraszam, że źle przeczytałem, to byłoby świetnie, gdy odpowiedź na to pytanie brzmiała Rob: - std :: copy (source.begin(), source.end(), destination); –

+0

Właśnie poprawiłem. Dziękuję za opowiadanie :) :) –

Powiązane problemy