Как получить верхние 3 значения из вектора, меньшего определенного значения?

#c #vector

#c #вектор

Вопрос:

У меня есть вектор {42.195 42.195 39.025 40.075 34.220 42.195 39.750}. Здесь я хочу получить верхние 3 значения, которые чуть меньше 42.195. Ниже приведен мой подход.

  1. Я отсортировал вектор в порядке убывания.
  2. Инициализируйте выходной вектор и счетчик = 0.
  3. Затем я прошел по вектору и проверил, не равен ли элемент 42.195. Если это так, увеличьте счетчик. Если значение счетчика равно <= 3, вставьте этот элемент в выходной вектор. Как только значение счетчика станет больше 3, выйдите из цикла for и верните выходной вектор.

Приведенный выше подход выглядит логически нормально, но код не работает нормально при сравнении каждого элемента со значением 42.195. Пожалуйста, помогите мне.

 #include<bits/stdc  .h>
#include<vector>

using namespace std;

int validateData(vector<float> amp;arr){
    for(int i = 0 ; i < arr.size() ; i  ){
        if(arr[i] <= 0.0){
            cout<<"nInvalid data";
            return -1; 
        }
    }
    return 0;
}

vector <float> getTop3(vector<float>amp; arr){
    if(validateData(arr) == -1)
        cout<<"nCannot perform operation";
    else {
        vector<float> output;
        int count = 0;
        cout<<"Sorted values are: n";
        sort(arr.begin(), arr.end(), greater<float>());
        for(int i = 0 ; i < arr.size() ; i  ){
            cout<<arr[i]<<" ";
        }
        for(int i = 0 ; i < arr.size() ; i  ){
            if(arr[i] != 42.195) {
                count  ;
                if(count <= 3)
                    output.push_back(arr[i]);
                else
                    break;
            }
        }
        cout<<"nOutput vector isn";
        for(int i = 0 ; i < output.size() ; i  ){
            cout<<output[i]<<" ";
        }
        return output;
    }
}

int main(int argc, char *argv[]){
    vector<float> arr;
    cout<<"Arguments are:n";
    for(int i = 1 ; i < argc ; i  ){
        arr.push_back(stof(argv[i]));
    }
    for(int i = 0 ; i < arr.size() ; i  ){
        cout<<arr[i]<<" ";
    }
    
    cout<<"n";
    //Function call
    getTop3(arr);
}
 

Ниже приведен вывод.

введите описание изображения здесь

Комментарии:

1. Похоже, вам может понадобиться научиться использовать отладчик для пошагового выполнения вашего кода. С хорошим отладчиком вы можете выполнить свою программу построчно и посмотреть, где она отклоняется от того, что вы ожидаете. Это важный инструмент, если вы собираетесь заниматься каким-либо программированием. Дальнейшее чтение: Как отлаживать небольшие программы и руководство по отладке

2. Кроме того, если вы сортируете данные, вы можете использовать std::lower_bound это, что значительно упрощает задачу.

3. ‘if(arr[i] != 42.195)’ это может вызвать проблемы из-за округления с плавающей запятой. Вы можете изменить на ‘if (fabs(arr [i] — 42.195)> 1.0e-7)’ установить допуск для равенства двух чисел с плавающей запятой.

Ответ №1:

std::partition затем std::nth_element может выполнить эту работу:

 std::vector<float> get_top3(std::vector<float> v, float threshold)
{
    auto end = std::partition(v.begin(), v.end(), [amp;](auto f){ return f < threshold; });
    if (std::distance(v.begin(), end) <= 3) return {v.begin(), end};
    std::nth_element(v.begin(), v.begin()   3, end, std::greater<>{});
    return {v.begin(), v.begin()   3};
}

int main() {
    std::vector<float> arr = {42.195, 42.195, 39.025, 40.075, 34.220, 42.195, 39.750};
    
    for (auto f : get_top3(arr, 42.195))
        std::cout <<  f << " ";
}
 

ДЕМОНСТРАЦИЯ

Одна из ваших проблем заключается в том, что: 42.195 != 42.195f .