Я хочу написать функцию, которая оценивает лениво и возвращает n
й элемент фильтрованного вектора. Меня интересует первый или второй элемент в векторе большую часть времени. Поэтому я не хочу фильтровать весь список, а затем найти n
й элемент.
Я учусь использовать Boost, и если есть простое решение с использованием Boost, было бы очень поучительно.
int main() {
double x[] = {10, 12.5, 12.9, 13.7, 50.07};
size_t length = sizeof(x)/sizeof(x[0]);
std::vector<double> vx(x, x+length);
// Need a function to filter out elements less than 11 and return the 2nd
// element greater than 11 (here 12.9) and return without evaluating 13.7 and 50.07
return 0;
}
Если вас интересует один из первых элементов, я бы наивно предложил что-то вроде этого:
std::vector<double>::iterator element(size_t n, const std::vector<double>& vec) {
std::vector<double>::iterator it = vec.begin();
size_t found = 0;
while (found != n && it != vec.end()) {
if (*(it++) >= 11) ++found;
}
return it;
}
У меня есть линейная сложность, но завершается, как только будет найдено требуемое совпадение.
Что-то вроде этого с помощью std::partition
float n=11.f;
auto it =std::partition(vx.begin(), vx.end(),
[n](const double & p){ return p <n;});
it++; //Second element
if( it!= vx.end())
std::cout<<"Element :"<<*it<<std::endl;
См. Здесь
n
й элемент, который я возвращаю.
it
в качестве std::vector<double>::iterator
Я не знаю, как использовать boost, но это то, что я буду использовать:
int binarySearch(int whatToSearch){
//recursive binary search
if value is found
return index
else //not found
return -index-1; //-index+1 will give you the place to insert that element
}
Тогда я бы получил второй элемент после возврата индекса, если он существует.
Вот код для бинарного поиска, который я использую
int mybinary_search(string array[],int first,int last, string search_key){
int index;
if (first > last)
index = -first-1;
else{
int mid = (first + last)/2;
if (search_key == array[mid])
return mid;
else if (search_key < array[mid])
index = mybinary_search(array,first, mid-1, search_key);
else
index = mybinary_search(array, mid+1, last, search_key);
} // end if
return index;
}
double findAskedValue(int value){
double x[] = {10, 12.5, 12.9, 13.7, 50.07};
size_t length = sizeof(x)/sizeof(x[0]);
int index = mybinarySearch(x,0,length, 11);
if(index >= 0)
cout << "value I'm searching for " << x[index+2] << endl;
else
cout << "value I'm searching for " << x[(-index-1)+2] << endl;
//instead of cout you can do what ever you want using that index
}
Одно небольшое объяснение: вы собираетесь вызвать findAskedValue (val), и он вернет вам значение. Если значение> 0, то элемент существует в списке, а index + 2 - это местоположение значения, которое вы ищете, else (-index-1) - это позиция, в которую нужно вставить этот элемент. -index-1 + 2 даст вам второй элемент.
Сложностью этого является O(log(n))
it
должна увеличиваться вwhile
цикл. Добавление++it
в конце вwhile
петли достаточно.