2012-06-28 3 views
7

ho letto la descrizione di std::nth_element a http://www.sgi.com/tech/stl/nth_element.htmlQuale è l'effetto di std :: nth_element (a.begin(), a.end(), a.end())?

template <class RandomAccessIterator> 
void nth_element(RandomAccessIterator first, RandomAccessIterator nth, 
       RandomAccessIterator last); 

Si noti che i presupposti siano

  1. [prima, ennesima) è un intervallo valido.
  2. [n., Ultimo) è un intervallo valido.

La mia domanda è:

E 'valida per chiamare std::nth_element(a.begin(), a.end(), a.end())? Se è così, qual è il suo effetto? In ogni caso, non viola le precondizioni di cui sopra. Ovunque nello standard della lingua (o in altri documenti) si afferma che nth deve puntare a un elemento in a?

+1

Perché non provarlo e vedere l'effetto. –

+2

Il risultato di una prova non è affidabile. Può essere dipendente dall'implementazione. In realtà mi chiedo dove sia questo problema specificato nello standard di C++. – updogliu

+0

@updogliu L'ultimo testo standard è sostanzialmente uguale alla pagina SGI che hai collegato. – Potatoswatter

risposta

5

È valido ed è probabilmente, ma non è garantito dallo standard, un'operazione nulla. Con i dati forniti, i due presupposti diventano:

[a.begin(), a.end()) is a valid range. 
[a.end(), a.end()) is a valid range. 

che sono sia vero, il secondo intervallo è vuoto però. Dallo standard 25.3.2/1:

Dopo nth_element l'elemento nella posizione puntato da all'ennesima è l'elemento che sarebbe in tale posizione se l'intera gamma stati ordinati. Anche per qualsiasi iteratore i nell'intervallo [primo, ennesimo) e qualsiasi iteratore j nell'intervallo [n., Ultimo) contiene:! (* I> * j) o comp (* j, * i) == false.

Se l'intera gamma è stato risolto dell'originale a.end() sarebbe a a.end() e per la seconda parte della gamma [nth, last) è vuota, quindi non ci sono elementi in cui calcolare le condizioni !(*i > *j) e comp(*j, *i) == false.

+0

Qualche ragionamento per sostenere l'asserzione? – Potatoswatter

+0

@Potatoswatter Penso che tu mi abbia aiutato a esprimere il mio caso nel tuo commento sulle altre risposte. –

+2

Voto inferiore quadrato:^2. – Potatoswatter

0

No, non è valido perché nth deve essere compreso nell'intervallo [first, last).

+0

Grazie per la modifica, @Lucian. –

+0

Dove è indicato questo requisito? Dice "l'elemento a cui punta l'iteratore nesimo è lo stesso dell'elemento che sarebbe in quella posizione ..." ma quel requisito è semplicemente nullo se non punta a nulla. – Potatoswatter

0

No, std::nth_element(a.begin(), a.end(), a.end()) non valido - viola il secondo presupposto, che richiede che l'iteratore nth (il secondo argomento) punti a un elemento valido. a.end() non punta a un elemento valido però.

+1

Ma tutti gli intervalli in C++ sono semiaperti e '[a, a)' è sempre un intervallo vuoto. Non c'è un chiaro requisito che l'ennesimo sia dereferenziabile. – Potatoswatter

+0

Grazie, sto ancora decidendo se rimuovere la mia risposta, ma non sono ancora convinto che sia sbagliato :) –

+0

Potatoswatter ha detto che la mia preoccupazione principale. – updogliu

Problemi correlati