2017-05-17 2 views
5

Puis-je coder comme std::max_element(std::begin(my_deque), std::end(my_deque))?Puis-je utiliser std :: max_element() sur std :: deque dans C++ 11?

Je demande parce que je sais que deque n'est pas garanti de stocker en continu, donc je veux savoir s'il se comportera correctement lors de l'utilisation des fonctions impliquant itérateur comme std::max_element?

Merci beaucoup!

+0

Etes-vous inquiet qu'il ne soit pas garanti de toujours travailler? – juanchopanza

+1

leur spécification nécessite seulement 'class ForwardIt', donc cela devrait fonctionner pour toute collection qui implémente l'itération vers l'avant. Cela n'a rien à voir avec le stockage contigu. –

+1

'std :: max_elements' requiert seulement un itérateur avant voir: http://en.cppreference.com/w/cpp/algorithm/max_element –

Répondre

7

std::max_element a une signature sous forme de

template<class ForwardIterator> 
ForwardIterator max_element(ForwardIterator first, ForwardIterator last); 

du nom du type de modèle, nous savons qu'il a besoin d'un iterator avant. Par [container.requirements.general] -Table 96 nous savons que std::deque utilise

toute catégorie iterator qui répond aux exigences de iterator avant

Ainsi puisqu'il utilise un itérateur vers l'avant ou mieux ce sera toujours d'accord.

6

Oui, cela fonctionnera correctement. La surcharge de std::max_element qui sera invoqué dans ce cas est

template< class ForwardIt > 
ForwardIt max_element(ForwardIt first, ForwardIt last); 

Les seules exigences sur les itérateurs sont

first, last - itérateurs avant définissant la plage d'examiner

Alors il n'y a aucune exigence sur les itérateurs d'accès aléatoires, seulement les itérateurs en avant.

+0

Vous avez raison à propos de '' max_element'' qui ne requiert que des itérateurs avant, mais il semble qu'il y ait une certaine confusion au sujet de la catégorie des itérateurs '' std :: deque'' (ils ont un accès aléatoire). Avoir des itérateurs à accès aléatoire n'implique pas de stockage contigu. –