1

我有以下程序在上限调用时崩溃。我不明白为什么会发生崩溃。我崩溃的任何原因。感谢您的帮助和时间。

#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;
}
4

4 回答 4

8

lower_boundupper_bound处理一个排序的序列。必须使用传递给两个函数的相同比较函数对序列进行排序。

当您插入元素时,InsertValues您按升序插入它们,因此您CompareLowerBoundValueAndTime是比较它们的正确方法。

但是因为upper_bound你传递了一个不同的比较函数。通过CompareLowerBoundValueAndTime(),它应该工作。

请注意,这CompareLowerBoundValueAndTime是一个误导性的名称。它应该是类似的东西CompareValueAndTimeAscending

于 2012-10-19T08:48:53.930 回答
1

您应该对 upper_bound 和 lower_bound 使用相同的比较器。区别在于算法,而不是比较。

于 2012-10-19T08:49:02.483 回答
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两次,这没有任何意义。

于 2012-10-19T08:49:07.837 回答
0

我认为您在 upper_bound 中遇到断言错误,因为它发现您的序列未正确排序。

您似乎误解了 upper_bound 的作用。它与 lower_bound 相同,只是迭代器指向的项目将严格大于搜索值,而不是大于或等于。如果没有这样的值,它将指向序列的结尾。

使用谓词 (Pred) 时,需要对其进行排序,使得

 Pred( iter2, iter1 )

每当 iter2 在序列中出现晚于 iter1 时,将返回 false。

您的序列和谓词组合并非如此,因此您会收到断言错误。

于 2012-10-19T08:58:02.553 回答