簡體   English   中英

cpp- lower_bound返回錯誤的迭代器

[英]cpp- lower_bound returns the wrong iterator

我有以下類Sudent,其函數名為isFail()。 如果等級<= 60,則此函數返回true,否則返回false。

class Student
{
    public:
        Student(std::string name_ , int const id_);
        virtual ~Student();
        void addGrade(int const grade2add);//grade above 100
        void removeGrade (int const grade2remove);  //update maxGrade
        bool isFail();//60-fail
        void print(); //id, name, grades

    private:
        std::string name;  //max 20 chars
        int const id; //5 digits, only digits
        std::vector<int> grades;

};

我實現了isFail函數:

bool Student::isFail()
{
    int temp= *lower_bound(grades.begin(), grades.end(), 61);
    if (temp <= 60)
        return true;
    else
        return false;
}

出於某種原因,我看到在以下情況下:[100,98,96,60,95] Temp等於100(第一個元素)而不是60。

ps包含所有相關庫以及使用命名空間std。

我閱讀http://www.cplusplus.com/reference/algorithm/lower_bound/中的文檔,根據他們的示例,它應該可以工作。

如果有更好的方法,請建議。

std::lower_bound正在返回正確的迭代器,它只是沒有做你想要的。 它返回不小於該值的第一個元素。 在您的情況下,矢量[100,98,96,60,95]的第一個元素是100。

也許看看std::min_element代替? 畢竟最小元素似乎是你正在尋找的。 http://en.cppreference.com/w/cpp/algorithm/min_element

來自std::lower_bound的文檔

返回指向范圍[first,last]中不小於(即大於或等於)值的第一個元素的迭代器。

因此, lower_bound似乎不是您正在尋找的未排序數組。 如果您仍想使用lower_bound ,您還應該考慮該文檔說:

范圍[first,last]必須至少部分排序

如果要查找最接近61但低於61的元素,則應首先對數組進行排序,或者編寫自己的算法來跟蹤最接近的元素但必須遍歷所有數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM