2014-10-10 19 views
13

Podczas iteracji na wektorze w C++, zauważyłem, że jest funkcja begin() w standardowej bibliotece, a także begin() jako funkcja składowa klasy vector . Co, jeśli w ogóle, stanowi różnicę między tymi dwoma, a które należy stosować w stosunku do innych?Różnica między wektorami :: begin() i std :: begin()

przykład:

vector<int> numbers; 
//Code to put values in my vector 
for (vector<int>::iterator i = numbers.begin(); i < numbers.end(); i++) 
    cout << *i << '\n'; 

vs.

vector<int> numbers; 
//Code to put values in my vector 
for (vector<int>::iterator i = std::begin(numbers); i < std::end(numbers); i++) 
    cout << *i << '\n'; 
+0

do pojemników są one takie same. Ale 'std :: begin' działa również dla wbudowanych tablic, co jest bardzo przydatne w funkcjach szablonów. – texasbruce

+0

OT, ale '++ i' jest prawdopodobnie bardziej wydajne niż' i ++ 'ponieważ ten drugi zwraca iterator o wartość –

+0

możliwy duplikat [Kiedy używać std :: begin i std :: end zamiast wersji specyficznej dla kontenera] (http : //stackoverflow.com/questions/8452130/when-to-use-stdbegin-and-stdend-instead-of-container-specific-versions) – edmz

Odpowiedz

15

std::begin() dodano C++ 11 w celu ułatwienia zapisu kod ogólny (na przykład w szablony). Najbardziej oczywistym powodem jest to, że zwykłe tablice w stylu C nie mają żadnych metod, stąd nie ma potrzeby ich stosowania. Możesz więc używać std::begin() z macierzami w stylu C, a także w kontenerach w stylu STL mających własne begin() i end().

Jeśli piszesz kod, który nie jest szablonem, możesz zignorować: std::begin(); twoi koledzy programiści prawdopodobnie uznają to za dziwne, jeśli nagle zaczniesz używać go wszędzie, tylko dlatego, że jest nowy.

+0

Co powiesz na używanie go tylko dlatego, że chcesz być konsekwentny? –

+0

@BenjaminLindley: Nie sądzę, że jest to dokładnie to, o czym mówił @RalphWaldoEmerson, kiedy powiedział: "" Głupia konsystencja jest hobgoblinem małych umysłów ", ale myślę, że rozpraszało by to zobaczenie' std :: begin () 'używane bez żadnego powodu, kiedy robimy to w starym stylu przez dziesięciolecia .Potrzebuje więcej pisania bez żadnych korzyści –

+0

@BenjaminLindley Wiem, że masz rację, a jednak, po prostu nie chcę. :(To jest to samo dla ++ dla iteratorów i i ++ dla liczb całkowitych .. Dokładnie tak, jak się przetaczam –

1

Implementacja std::begin() dla wektorów po prostu wywołuje std::vector<T>::begin(), więc nie ma różnicy między nimi w tym przypadku.

Gdzie std::begin() przychodzi do swoich własnych algorytmów jest w ogólnych:

template<typename Container> 
void my_algorithm(Container c) { 
    using std::begin; 
    using std::end; 
    auto const start = begin(c); // ADL will find the appropriate overload 
    auto const finish = end(c); 
    // ... rest of code ... 
} 
Powiązane problemy