2012-04-07 18 views
17

Poiché sono stati aggiunti i non appartenenti alla Chiesa begin() e end() funzioni standard contiene in C++ 11 revisione, non perché hanno le versioni non appartenenti alla Chiesa delle funzioni rbegin() e rend() stato aggiunto pure? Mi sento sciocco dopo aver iniziato a utilizzare le versioni non membro di begin() e end(), solo per scoprire che ora devo passare dall'uso delle chiamate alle funzioni membro e non membro. (Mi rendo conto che sarebbe banale girare le mie versioni non membro di rbegin() e rend(), ma mi chiedo perché questo non è stato aggiunto allo standard).C++ 11: non membro rbegin()/rend() Funzioni

Grazie per l'input.

+0

Ricordo che qualcosa è stato detto a riguardo in una delle presentazioni di [Going Native 2012] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012). Sembra che queste funzioni siano state semplicemente dimenticate e possa (sarà?) Essere aggiunto nello standard in un secondo momento. –

+0

Le funzioni non membro 'begin()' e 'end()' sono usate dalla nuova forma di istruzione 'for' aggiunta a C++ 11. Le altre funzioni no. –

risposta

5

È possibile costruire l'intervallo di inversione manualmente utilizzando std::reverse_iterator sui risultati di std::begin e std::end.

Stranamente, non esiste una funzione di fabbrica standard per reverse_iterator. Se non ci fosse, sarebbe probabilmente simile a questa:

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

Armati di questo, si può fare

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

Questo esempio evita di specificare il std::greater confronto, ma il reverse_iterator plausibilmente potrebbe influire negativamente prestazioni se il compilatore non può rimuovere la complessità aggiunta dai loop interni.

7

Per le persone che lo vedono più tardi, il numero non comune rbegin() e rend() sono già in C++ 14.

+1

Sì! http://en.cppreference.com/w/cpp/iterator/rbegin – Johnsyweb

+1

Ha! Questo è quello che mi aspetto. Perché non riesco a vedere l'overhead di aggiungere rbegin() basato su begin() nonmember function. Abbraccia C++ 14! – 8090PZ

Problemi correlati