2012-04-07 9 views
17

Ponieważ nie będących członkami begin() i end() funkcje zostały dodane do standardu zawiera w C++ 11 rewizji, to dlaczego nie mają nie będących członkami wersje funkcji rbegin() i rend() było również dodane? Czuję się głupio po rozpoczęciu korzystania z wersji niemonetowych begin() i end(), tylko po to, aby przekonać się, że muszę teraz przełączać się między wykorzystaniem wywołań funkcji member i nonmember. (Rozumiem, że byłoby trywialnie rzutować moje wersje niezależne od rbegin() i rend(), ale zastanawiam się, dlaczego nie zostało to dodane do standardu).C++ 11: nie będących członkami rbegin()/rend() Funkcje

Dzięki za twój wkład.

+0

Pamiętam, że coś o tym powiedziano w jednej z prezentacji na [Going Native 2012] (http://channel9.msdn.com/Events/GoingNative/GoingNative 2012). Wygląda na to, że funkcje te zostały po prostu zapomniane i mogą (zostaną?) Dodane w standardzie w późniejszym czasie. –

+0

Niezarejestrowane funkcje 'begin()' i 'end()' są używane przez nową postać instrukcji 'for' dodanej do C++ 11. Pozostałe funkcje nie są. –

Odpowiedz

5

Możesz skonstruować odwrócony zakres ręcznie za pomocą std::reverse_iterator na wynikach std::begin i std::end.

Dziwnie, nie ma standardowej funkcji fabrycznej dla reverse_iterator. Gdyby nie było, to prawdopodobnie wyglądać następująco:

template< typename iter > 
std::reverse_iterator<iter> reverse(iter i) 
    { return { i }; } 

Armed z tym, można zrobić

std::sort(reverse(std::end(my_array)), reverse(std::begin(my_array))); 

Przykład ten oszczędza kłopotu z określeniem std::greater porównawczy, ale reverse_iterator conceivably mogłyby negatywnie wpłynąć wydajność, jeśli kompilator nie może usunąć dodatkowej złożoności z wewnętrznych pętli.

7

Dla osób, które zobaczą to później, nie należące do grupy rbegin() i rend() są już w C++ 14.

+1

Yup! http://pl.cppreference.com/w/cpp/iterator/rbegin – Johnsyweb

+1

Ha! Tego się spodziewam. Ponieważ nie widzę narzutu dodawania funkcji rbegin() opartej na funkcji nonmember begin(). Embrace C++ 14! – 8090PZ