2017-05-17 18 views
5

std::max_element(std::begin(my_deque), std::end(my_deque)) gibi bir kod yazabilir miyim?st ++ :: deque'de st ++ :: max_element() öğesini C++ 11'de kullanabilir miyim?

Soruyorum çünkü deque'in sürekli olarak depolanmasının garanti edilmediğini biliyorum, bu nedenle std::max_element gibi yineleyici içeren işlevleri kullanırken düzgün davranıp davranmayacağını bilmek istiyorum?

Çok teşekkür ederim!

+0

Her zaman işe yaramayacağından endişeleniyor musunuz? – juanchopanza

+1

sadece "ForwardIt" sınıfını gerektirir, bu nedenle ileri iterasyon uygulayan herhangi bir koleksiyon için çalışmalıdır. Bitişik depolama ile hiçbir ilgisi yoktur. –

+1

'std :: max_elements' yalnızca bir ileri iteratör gerektirir: http://en.cppreference.com/w/cpp/algorithm/max_element –

cevap

7

std::max_element bunu bir ileri yineleyici gerektirdiğini biliyoruz şablon türü adı itibaren

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

şeklinde bir imzası vardır. 96 [container.requirements.general] -Masa Başına biz std::deque kullandığı biliyoruz

bir ileri yineleme kullanır ya da daha iyi her zaman olacağından

Pekala öne yineleyici gereksinimlerini karşılayan herhangi bir yineleyici kategorisi Tamam.

6

Evet, doğru şekilde çalışacaktır. aralığını tanımlayan ileri yineleyiciler

Yani incelemek - bu durumda çağrılır std::max_element aşırı yük adım adım elde üzerinde

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

sadece gereksinimleri

first

, last olmasıdır rastgele erişimli yineleyiciler hakkında herhangi bir gereksinim yoktur, yalnızca ileri yineleyiciler.

+0

Sadece “italyanlar” ibaresiyle ilgili “max_element” hakkında haklısınız, ancak 'std :: deque'' iteratörler kategorisi hakkında birtakım karışıklıklar var gibi görünüyor (rastgele erişim). Rastgele erişime sahip yineleyiciler, bitişik depolama anlamına gelmez. –

İlgili konular