2016-08-24 77 views
6

Biorąc pod uwagę sortowane std::vector<int>, chciałbym, za pomocą funkcji C++ 11-STD, znaleźć indeks, w którym elementy przejść od negatywnego do pozytywnego.Podany posortowany wektor znajduje przejście z ujemnego do dodatniego

Mam świadomość, że mogę to zaimplementować za pomocą wyszukiwania binarnego, ale jestem zainteresowany, czy istnieje jakakolwiek funkcja w standardowej bibliotece, podobna do unarnej find_if, która ułatwiłaby to wyszukiwanie (być może w połączeniu z prawidłowym wyrażeniem lambda).

+0

Co z 'std :: find_if'? – Rakete1111

+1

@ Rakete1111: find_if jest liniowy, ale problem jest rozwiązywany w czasie LogN –

+0

@ Armen Tsirunyan Prawda, nawet poza tym nie wiem, jak używać find_if w tym kontekście – user695652

Odpowiedz

14

należy znaleźć lower_bound od 0:

auto iter = std::lower_bound(vec.begin(), vec.end(), 0); 

otrzymany iterator będzie wskazywać na najbliższym miejscu, gdzie można wstawić 0 bez zakłócania kolejność elementów. Podobnie, upper_bound zwróci najbardziej prawy taki iterator.

runtime algorytmu jest O(logN)

+0

genialny! :) dzięki – user695652