2014-10-10 23 views
13

Während über einen Vektor in C++ Iterieren, bemerkte ich, gibt es eine begin() Funktion in der Standard-Bibliothek, und auch ein begin() als Memberfunktion der Klasse vector . Was, wenn überhaupt, ist der Unterschied zwischen den beiden, und welche sollten gegenüber der anderen verwendet werden?Unterschied zwischen Vektor :: begin() und std :: begin()

Beispiel:

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

für Container sie gleich sind. Aber "std :: begin" funktioniert auch für eingebaute Arrays, was sehr nützlich in Template-Funktionen ist. – texasbruce

+0

OT, aber '++ i' ist wahrscheinlich effizienter als' i ++ ', da letzterer einen Iterator mit dem Wert –

+0

zurückgibt. Mögliches Duplikat von [Wann std :: begin und std :: end anstelle von containerspezifischen Versionen] (http : //stackoverflow.com/questions/8452130/when-to-use-stdbegin-and-stdend-instead-of-container-specific-versions) – edmz

Antwort

15

std::begin() wurde hinzugefügt in C++ 11, um es einfacher generischen Code schreiben (zum Beispiel in Vorlagen). Der offensichtlichste Grund dafür ist, dass reine C-artige Arrays keine Methoden haben, daher keine .begin(). So können Sie std::begin() mit C-artigen Arrays verwenden, sowie STL-Container mit eigenen begin() und end(). Wenn Sie Code schreiben, der keine Vorlage ist, können Sie ignorieren: std::begin(); Ihre Mitprogrammierer würden es wahrscheinlich seltsam finden, wenn Sie sie plötzlich überall benutzen würden, nur weil es neu ist.

+0

Wie wäre es mit der Verwendung, nur weil Sie konsistent sein wollen? –

+0

@BenjaminLindley: Ich denke nicht, dass @RalphWaldoEmerson genau daran dachte, als er sagte: "Eine törichte Konsequenz ist der Hobgoblin der kleinen Geister", aber ich denke, es würde ablenken, "std :: begin" zu sehen.) '' verwendet ohne Grund, wenn wir es auf die alte Art seit Jahrzehnten getan haben.Es erfordert mehr Tipparbeit für keinen Vorteil. –

+0

@BenjaminLindley Ich weiß, dass Sie Recht haben, und doch will ich einfach nicht. :(Es ist die Das gleiche gilt für ++ it für Iteratoren und i ++ für ganze Zahlen, genau wie ich rolle. –

1

Die Implementierung von std::begin() für Vektoren ruft einfach std::vector<T>::begin(), so gibt es keinen Unterschied zwischen den beiden in diesem genauen Fall.

Wo std::begin() kommt in seine eigene ist in generische Algorithmen:

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 ... 
} 
Verwandte Themen