我有一个对象的排序向量。我将使用std :: upper_bound和std :: lower_bound来查找所有元素,以便(data> = a)&& (数据
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
struct comp_lower
{
comp_lower() {}
bool operator()(const pair<double, unsigned> &data, const double &bound) const
{
return data.first<bound;
}
};
struct comp_upper
{
comp_upper() {}
bool operator()(const double &bound, const pair<double, unsigned> &data) const
{
return bound <= data.first;
}
};
int main(void)
{
std::vector< std::pair<double, unsigned> > sortData;
// sort the data manually based on the first entry
sortData.push_back( make_pair(-5, 1) );
sortData.push_back( make_pair(-4.5, 10) );
sortData.push_back( make_pair(-4 , 19) );
sortData.push_back( make_pair(-4 , 2) );
sortData.push_back( make_pair(-3.5 , 28) );
sortData.push_back( make_pair(-3.5 , 11) );
sortData.push_back( make_pair(-3 , 37) );
sortData.push_back( make_pair(-3 , 20) );
sortData.push_back( make_pair(-3 , 3) );
sortData.push_back( make_pair(-2.5 , 12) );
sortData.push_back( make_pair(-2.5 , 29) );
sortData.push_back( make_pair(-2 , 38) );
sortData.push_back( make_pair(-2 , 21) );
sortData.push_back( make_pair(-2 , 4) );
sortData.push_back( make_pair(-1.5 , 30) );
sortData.push_back( make_pair(-1.5 , 13) );
sortData.push_back( make_pair(-1 , 39) );
sortData.push_back( make_pair(-1 , 22) );
sortData.push_back( make_pair(-1 , 5) );
sortData.push_back( make_pair(-0.5 , 31) );
sortData.push_back( make_pair(-0.5 , 14) );
sortData.push_back( make_pair(0 , 6) );
sortData.push_back( make_pair(0 , 23) );
sortData.push_back( make_pair(0 , 40) );
sortData.push_back( make_pair(0.5 , 32) );
sortData.push_back( make_pair(0.5 , 15) );
sortData.push_back( make_pair(1 , 41) );
sortData.push_back( make_pair(1 , 24) );
sortData.push_back( make_pair(1 , 7) );
sortData.push_back( make_pair(1.5 , 33) );
sortData.push_back( make_pair(1.5 , 16) );
sortData.push_back( make_pair(2 , 42) );
sortData.push_back( make_pair(2 , 25) );
sortData.push_back( make_pair(2 , 8) );
sortData.push_back( make_pair(2.5 , 17) );
sortData.push_back( make_pair(2.5 , 34) );
sortData.push_back( make_pair(3 , 43) );
sortData.push_back( make_pair(3 , 26) );
sortData.push_back( make_pair(3 , 9) );
sortData.push_back( make_pair(3.5 , 35) );
sortData.push_back( make_pair(3.5 , 18) );
sortData.push_back( make_pair(4 , 44) );
sortData.push_back( make_pair(4 , 27) );
sortData.push_back( make_pair(4.5 , 36) );
sortData.push_back( make_pair(5 , 45) );
double a = -4.1;
double b = -3.0;
vector< pair<double, unsigned> >::iterator lower = std::lower_bound(sortData.begin(), sortData.end(), a, comp_lower());
vector< pair<double, unsigned> >::iterator upper = std::upper_bound(sortData.begin(), sortData.end(), b, comp_upper());
cout << (lower->first) << "," << (lower->second) << " [" << a << "]" << endl;
cout << (upper->first) << "," << (upper->second) << " [" << b << "]" << endl << endl;
return 0;
}
这里我搜索的所有元素的第一个条目大于或等于-4.1且小于-3。它应该返回(-4,19)和(-3.5,11)但它返回(0,0)和(-3,37)。我认为我使用了upper_bound和lower_bound错误,但我没有把它想出来。
答案 0 :(得分:0)
为什么它不返回(-4,19)作为第一个结果:comp_lower中的参数类型错误。 bound
参数应为double
,而非无符号。
为什么它不返回(-3.5,11)作为第二个结果:您的代码显示为double b = -3.0
,即使您的问题描述为-3.9。
尽管如此,这还不太正确。 lower_bound
和upper_bound
都会返回满足特定规则的序列的 first 元素,因此两者都不能直接适合查找所需上限的任务。但是,如果您只是采用前面的元素,您将得到正确的结果:
vector< pair<double, unsigned> >::iterator upper =
std::upper_bound(sortData.begin(), sortData.end(), b, comp_upper()) - 1;
当然,您必须检查upper_bound是否已返回序列的第一个元素,以便迭代器不会超出减量范围。