5

我正在尝试upper_bound在 a 上使用vector<pair<int,int>>,如下所示:

vector<pair<int,int>> data;
auto up = upper_bound(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'

为什么要尝试将 aconst int与 a进行比较pair<int,int>

我尝试编写自己的比较函数,但它并没有改变任何东西。如果我这样做,编译器会尝试将 a 转换pair<int,int>为 a 。const int

4

4 回答 4

6

您正在将一对与数字进行比较,没有预定义的比较运算符。你可能想把它改成这样:

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);
}
于 2013-02-17T14:22:53.343 回答
2

为什么要尝试将 const int 与 pair 进行比较?

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

啧啧!

也许您正在寻找:

auto up = upper_bound(data.begin(), data.end(), make_pair(0, 0));
于 2013-02-17T14:27:25.700 回答
0

to的第三个参数std::upper_bound是返回的迭代器指向的元素应该大于的值。你将如何确定一个std::pair<int,int>是否大于0或不?

你通过的几乎可以肯定是std::pair<int,int>

auto up = upper_bound(data.begin(), data.end(), std::make_pair(first, second));

但是,first取决于second您要解决的问题。

于 2013-02-17T14:24:08.873 回答
0

如果您正在搜索不兼容的类型,则需要特别注意比较功能。引用cppreference.com

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

bool cmp(const Type1 &a, const Type2 &b);

[…] 类型Type1必须是类型对象T可以隐式转换为Type1. 类型Type2必须是ForwardIt可以取消引用类型的对象,然后隐式转换为Type2。​</p>

– 在您的情况下,Type1=intType2= std::pair<int, int>。这应该够了吧。

于 2013-02-17T14:31:57.477 回答