C++ 向量上的上界<;配对<;int,int>&燃气轮机;

C++ 向量上的上界<;配对<;int,int>&燃气轮机;,c++,stl,C++,Stl,我试图在向量上使用上限,如下所示: vector<pair<int,int>> data; auto up = upper_bound(data.begin(), data.end(), 0); 矢量数据; 自动向上=上限(data.begin(),data.end(),0); VS2012给了我以下错误: error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,c

我试图在
向量上使用
上限
,如下所示:

vector<pair<int,int>> data;
auto up = upper_bound(data.begin(), data.end(), 0);
矢量数据;
自动向上=上限(data.begin(),data.end(),0);
VS2012给了我以下错误:

error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'const int'

错误C2784:'bool std::operator您正在将一对与一个数字进行比较,没有预定义的比较运算符。您可能希望将其更改为以下内容:

auto up = upper_bound(data.begin(), data.end(), make_pair(0, 0));
或者,如果应用程序中有一个特定的逻辑用于将一对数字与单个数字进行比较,则可以提供自己的比较功能:

bool cmp(int n, pair<int, int> const& p)
{
    // For instance...
    return ((p.first < n) && (p.second < n));
}

int main()
{
    vector<pair<int,int>> data;
    auto up = upper_bound(data.begin(), data.end(), 0, cmp);
}
bool cmp(整数n,成对常数和对数)
{
//例如。。。
返回((p.first
std::upper_bound
的第三个参数是返回迭代器指向的元素应大于的值。如何确定
std::pair
是否大于
0

您传递的几乎肯定是
std::pair

但是,
first
second
取决于您试图解决的问题

为什么它试图将常量int与一对进行比较

因为是你告诉它的。比较值为
0
,但元素类型为
pair

嘟嘟

也许您正在寻找:

auto up = upper_bound(data.begin(), data.end(), make_pair(0, 0));

如果要搜索不兼容的类型,则需要在比较函数中特别小心。引述自:

比较函数的签名应等同于以下内容:

bool cmp(const Type1 &a, const Type2 &b);
[…]类型
Type1
必须确保类型
T
的对象可以隐式转换为
Type1
。类型
Type2
必须使类型为
ForwardIt
的对象可以取消引用,然后隐式转换为
Type2
。​


–在您的情况下,
Type1
=
int
Type2
=
std::pair
。在这个调用中,
上限(data.begin(),data.end(),0)最后一个参数显然是一个数字。显示你的比较器。搜索一个数字可能绝对有意义。事实上,我有一个确切的用例(我正在搜索一条线上包含一个点的间隔)。@不,为什么?标准库中的排序数组搜索算法是根据这个用例明确设计的(请参阅比较函数的文档)。这是一个合法的用途,实际上也是一个非常常见的用途——它是表示范围集合的一种简单而有效的方法。这不是完全等效的吗?哈哈,我已经寻找复杂的东西一个小时了,但我从来没有想过要查看参数(我只是用0来做一些测试)。对不起,我现在很尴尬@是的,是的。“例如……”的意思是说它可以改变。
bool cmp(const Type1 &a, const Type2 &b);