2017-02-24 5 views
18

Rozważ poniższy kod.Czy wektor jest znany z rezerwowania jako pierwszy przy inicjalizacji przez parę iteratorów?

struct MyData{ 
    MyData(const BYTE* pData, size_t uSize) 
     : bucket_(pData, pData + uSize) 
    {}  
    std::vector<BYTE> bucket_; 
}; 

mój bucket_ zrobić reserve pierwszy podczas inicjalizacji z parą iteratorów? Coś jak vec.reserve(std::distance(begIter, endIter)).

A może po prostu wykonujesz poważnie: push_back lub back_inserter_iterator::operator=?

Jeśli nie, być może trzeba zainicjować go za pomocą uSize z 0, a następnie wykonaj memcpy_s w bloku konstruktora.

Odpowiedz

22

Czy mój bucket_ wykonuje najpierw reserve podczas inicjalizacji z pary iteratorów?

Tak, działa.

Standardowy zanurzenie:

Złożoność: Sprawia tylko N wzywa do konstruktora kopii T (gdzie n oznacza odległość między pierwszym i ostatnim) i żadnych realokacjach jeśli iteratory pierwsze i ostatnie są z przodu, kategorie dwukierunkowe lub losowe. Wykonuje rozkaz N wywołania konstruktora kopiowania T oraz logarytmicznego (N) realokacji, jeśli są one tylko wejściowymi iteratorami.

(Wskaźniki są random access iteratory)

+1

Należy zatem wykonać 2 przejścia, jeśli są do przodu lub w dwóch kierunkach (jeden dla odległości, drugi dla przydzielenia). W niektórych przypadkach narożnych (gdzie iteracja jest znacznie wolniejsza niż kopiowanie wynikowych danych), ręczne wstawianie pojedynczego elementu może być szybsze. – Yakk

+0

@Yakk: Prawdopodobnie; wszystkie standardowe algorytmy biblioteczne będą prawdopodobnie implementowane przy założeniu, że iteracja jest względnie tania, tak więc rozwijanie własnej alternatywy może być szybsze, jeśli nie jest to prawdą. – Hurkyl

8

Tak, to gwarantuje, że nie będzie ponownych przydziałów, ponieważ wskaźniki są RandomAccessIterators. vector.cons/9

template <class InputIterator> 
vector(InputIterator first, InputIterator last, const Allocator& = Allocator()); 

Efekty: konstruuje wektor równą zakresie [first, last) przy użyciu odpowiedniego przydzielania.

Złożoność: tylko sprawia N połączenia do konstruktora kopii z T (gdzie N jest odległością pomiędzy first i last) i nie realokacje jeśli iteratory pierwsze i ostatnie są z przodu, dwukierunkowy, lub losowych kategoriach dostępowych. To sprawia, że ​​zamówienie N wywołuje do konstruktora kopiowania z T i porządek log(N) zamówienia, jeśli są one tylko wejściowe iteratory.

Powiązane problemy