2012-10-19 95 views
1

我有下面的程序在上限調用時崩潰。我不明白爲什麼會出現崩潰。任何我爲什麼會崩潰的原因。感謝您的幫助和時間。當在C++中使用upper_bound時崩潰

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

enum quality { good = 0, bad, uncertain }; 

struct sValue { 
    int time; 
    int value; 
    int qual; 
}; 

struct CompareLowerBoundValueAndTime { 
    bool operator()(const sValue& v, int time) const { 
     return v.time < time; 
    } 

    bool operator()(const sValue& v1, const sValue& v2) const { 
     return v1.time < v2.time; 
    } 

    bool operator()(int time1, int time2) const { 
     return time1 < time2; 
    } 

    bool operator()(int time, const sValue& v) const { 
     return time < v.time;  
    } 
}; 

struct CompareUpperBoundValueAndTime { 
    bool operator()(const sValue& v, int time) const { 
     return v.time > time; 
    } 

    bool operator()(const sValue& v1, const sValue& v2) const { 
     return v1.time > v2.time; 
    } 

    bool operator()(int time1, int time2) const { 
     return time1 > time2; 
    } 

    bool operator()(int time, const sValue& v) const { 
     return time > v.time;  
    } 
}; 

class MyClass { 

public: 
    MyClass() { 
     InsertValues(); 
    } 

     void InsertValues(); 

     int GetLocationForTime(int time); 

     void PrintValueContainer(); 

private: 

    vector<sValue> valueContainer; 
}; 

void MyClass::InsertValues() { 
    for(int num = 0; num < 5; num++) { 
     sValue temp; 
     temp.time = num; 
     temp.value = num+1; 
     temp.qual = num % 2; 
     valueContainer.push_back(temp); 
    } 
} 

void MyClass::PrintValueContainer() 
{ 
    for(int i = 0; i < valueContainer.size(); i++) { 
     std::cout << i << ". " << valueContainer[i].time << std::endl; 
    } 
} 




int MyClass::GetLocationForTime(int time) 
{ 
    std::vector<sValue>::iterator lower, upper; 
    lower = std::lower_bound(valueContainer.begin(), valueContainer.end(), time, CompareLowerBoundValueAndTime()); 

    upper = std::upper_bound(valueContainer.begin(), valueContainer.end(), time, CompareUpperBoundValueAndTime()); // Crashing here. 

    std::cout << "Lower bound: " << lower - valueContainer.begin() << std::endl; 
    std::cout << "Upper bound: " << upper - valueContainer.begin() << std::endl; 

    return lower - valueContainer.begin(); 
} 



int main() 
{ 
    MyClass a; 
    a.PrintValueContainer(); 
    std::cout << "Location received for 2: " << a.GetLocationForTime(2) << std::endl; 
    return 0; 
} 
+0

+1表示完整的(儘管稍微過量)示例。 –

回答

8

lower_bound並在排序序列upper_bound工作。序列必須使用您傳遞給兩個函數的相同比較函數進行排序。

當您插入InsertValues中的元素時,將以升序插入它們,因此您的CompareLowerBoundValueAndTime是比較它們的正確方法。

但是對於upper_bound,您傳遞的是不同的比較函數。通過CompareLowerBoundValueAndTime(),它應該工作。

請注意CompareLowerBoundValueAndTime是一個誤導性的名字。它應該是沿着CompareValueAndTimeAscending的行。

1

您應該對upper_bound和lower_bound都使用相同的比較器。區別在於算法中,而不是在比較中。

1

您的編譯器正在給您答案。這裏檢查你的代碼:http://ideone.com/x6RE9

這給你一個錯誤說:

prog.cpp: In member function ‘int MyClass::GetLocationForTime(int)’: 
prog.cpp:94: error: no match for ‘operator*’ in ‘*upper.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = sValue*, _Container = std::vector<sValue, std::allocator<sValue> >]()’ 

你不必提領upper兩次,它沒有任何意義。

+0

這是他的方式顯示它的崩潰,看看最後,還有2顆星。 – Serdalis

+1

我認爲**只是突出顯示它崩潰的行 –

+0

工作代碼在這裏:http://ideone.com/s2bQm,沒有**(我在發佈答案後的一分鐘:)) – alestanis

0

我認爲你在upper_bound中得到一個斷言錯誤,因爲它發現你的序列沒有正確排序。

您似乎誤解了upper_bound的作用。它與lower_bound相同,除了迭代器指向的項目嚴格大於搜索值,不是大於或等於。如果沒有這樣的值,它將指向序列的結尾。

當使用謂詞(潑尼鬆),它需要進行排序使得每當iter2晚於iter1出現在序列中

Pred(iter2, iter1) 

將返回false。

你的序列和謂詞組合並非如此,因此你會得到一個斷言錯誤。