2014-06-05 15 views
5

Considerare uno std::vector<std::pair<int, int>> ordinato in base al confronto del primo elemento della coppia.Ho la garanzia che std :: unique manterrà il primo elemento?

Ora supporre che io applica:

std::unique(std::begin(v), 
      std::end(v), 
      [](const std::pair<int, int>& x, const std::pair<int, int>& y) 
      {return x.first == y.first;}); 

Devo avere la garanzia che std::unique non mancherà di tenere il primo elemento di ogni intervalli uguali?

risposta

9

Sì.

Elimina tutto tranne il primo elemento da ogni gruppo consecutivo di elementi equivalenti dall'intervallo [primo, ultimo) e restituisce un iteratore passato alla fine per il nuovo fine logico dell'intervallo.

From here.

Il BinaryPredicate avete dato solo significa che qualsiasi elemento con y uguale all'elemento precedente x verrà rimosso.

2

Sì. The C++14 draft standard dice in sezione 25.3.9 [alg.Unique] (sottolineatura mia):

Effetti: Per un intervallo non vuoto, elimina tutti tranne il primo elemento da ogni gruppo consecutivo di elementi equivalenti a cui si riferisce l'iteratore nell'intervallo [primo + 1, ultimo) per il quale sono valide le seguenti condizioni: * (i - 1) == i o pred ( (i - 1), * i)! = false.

La citazione dello standard è importante qui perché le fonti abituali di Internet su questo punto dare due risposte diverse: en.cppreference.com non dà la garanzia, ma cplusplus.com (citato da Benabove ha la garanzia .)

Problemi correlati