2017-05-25 99 views
8

azalan sıralanır bir vektör bir anahtar az kesinlikle birinci eleman bul Logaritmik zamanda elde edilen sonuç. Vektör zaten azalan sırada sıralandığından, ikili arama yaklaşımı kullanmak istiyorum.şöyle bu görev find_if() STL-Algoritma fonksiyonu kullanılarak gerçekleştirilebileceği de anlıyorum sırasını

STL Algoritması işlevini anlıyorum lower_bound ve upper_bound, logaritmik karmaşıklığı garanti eder. Ancak, birinci öğeyi bir anahtardan büyük veya ona eşit olan birinci öğeden farklı olarak bir anahtardan daha az elde etmek için bu işlevleri nasıl kullanacağımı anlayamıyorum. Örneğin

:

varsayalım benim vektör içeriği şunlardır: 21 9 8 7 6 4

Benim anahtardır: 10

Ben çıkış 9 olmak ister ki, bir ilk eleman soldan sağa beri 10'dan daha az olan vektörün taranması.

Bu konuda herhangi bir yardım çok yararlı olacaktır!

Teşekkür

+0

olduğu [bu] (https://stackoverflow.com/questions/13399243/how-to-find-the-first-smaller-element-than- bir tamsayı-x-in-a-vektör-c) ama ileriye doğru aramak için aramayı geriye doğru değiştirmeniz gerekir. – NathanOliver

cevap

8

Sen fonksiyonel nesne std::greater standart algoritma std::upper_bound kullanabilirsiniz.

İşte nasıl yapılabileceğine bir örnektir.

#include <iostream> 
#include <iterator> 
#include <functional> 
#include <algorithm> 

int main() 
{ 
    int a[] = { 21, 9, 8, 7, 6, 4 }; 
    int key = 10; 

    auto it = std::upper_bound(std::begin(a), std::end(a), 
     key, std::greater<int>()); 

    if (it != std::end(a)) std::cout << *it << std::endl; 
} 

program çıktı Temelde

9