2016-03-08 22 views
6

Zauważyłem istnieją 2 sposoby, aby uzyskać iteracyjnej końcowy wektora (lub inną klasę zbiornika):Różnica między std :: końca (myvector) i myVector.end()

std::end(myVector) 

i

myVector.end() 

To samo dotyczy wielu innych funkcji pojemnik iterator, begin, cend, cbegin, rend, rbegin, crend, crbegin, find itp co mam zastanawiasz się, czy jest jakaś różnica funkcjonalna między nimi? A jeśli nie, czy istnieje jakiś historyczny powód, aby mieć obie z nich?

(Przepraszam, jeśli jest to duplikat, rozglądałem się wszędzie, a znaleźć wiele źródeł dla jednego lub drugiego z tych sposobów, ale żaden nie wspomina zarówno lub porównuje dwa).

Odpowiedz

7

Jest przyczyna historyczna: przed C++ 11 istniały tylko wersje funkcji członkowskich. C++ 11 dodał nie-członków, które działają również dla zwykłych macierzy w stylu C, więc można je uznać za bardziej ogólne.

int a[] = {3, 1, 5, 67, 28, -12}; 
std::sort(std::begin(a), std::end(a)); 

Kiedy stosuje się do standardowych pojemników bibliotecznych, efekt std::begin i std::end jest wywołanie begin() i end() funkcji składowych pojemnika, więc nie ma różnicy funkcjonalne.

C++ 14 dodaje std::cbegin, std::cend, , std::rend, std::crbegin i std::crend z podobne zachowanie.

+0

Jedyna różnica polega na tym, że nowa metoda działa również na tablicach? W porządku. Przydatne, myślę - być może będę musiał zapytać osobę, która napisała ten kod, dlaczego używamy go na 'wektorach 'i po prostu czyni niepotrzebnie bardziej gadatliwy kod, ale myślę, że to odpowiada na moje pytanie. –

+0

@DarrelHoffman Sądzę, że to kwestia wyboru, ale wolę używać funkcji, które nie są członkami, jeśli to możliwe. BTW, jeśli parametr jest standardowym kontenerem biblioteki, 'std ::' można pominąć, a 'begin (v)' nie jest dużo bardziej gadatliwy niż 'v.begin()'. – juanchopanza

+0

Tak, choć potencjalnie niebezpieczne w tym przypadku - znaczna część naszego kodu jest współdzielona przez wiele zespołów w różnych częściach świata, z których część nadal działa w C++ 0x ze względu na starsze wersje. Nie spodziewam się, aby ta konkretna część kodu powodowała problemy, ale w przeszłości były konflikty. (Musimy zaznaczyć pewne klasy jako "No C++ 11 allowed", aby nie łamały się kompilacje innych zespołów ...) –