5

私はこのようにで使用しようとしていupper_boundます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'

const intなぜ aと aを比較しようとしているのpair<int,int>ですか?

独自の比較関数を書いてみましたが、何も変わりません。私がそうすると、コンパイラは apair<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 をペアと比較しようとするのはなぜですか?

あなたがそう言ったからです。比較値は です0が、要素タイプはpair<int,int>です。

やったー!

おそらくあなたが探しているのは:

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

の3番目の引数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));

ただし、解決しようとしている問題によって異なりますfirstsecond

于 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 に答える