3

STLマップで文字列キーのupper_boundを検索します

STLマップで文字列キーのupper_boundを見つけようとしていますが、正確な結果が得られません。このプログラムを実行できる場合、結果は奇妙で、上限と下限の両方が「qwerzzx」を指していることがわかります。

私のコードに間違いがありますか、または私は上限の操作を誤解しています..?

#include<iostream> 
#include<cstring>
#include <map>
using namespace std;
int main()
{
    map<string, int> testmap;
    map<string, int>::iterator poslow;
    map<string, int>::iterator posup;

    testmap.insert(make_pair<string, int>("asdfghjkliopp", 1));
    testmap.insert(make_pair<string, int>("asdfghjklioppswert", 1));
    testmap.insert(make_pair<string, int>("sdertppswert", 1));
    testmap.insert(make_pair<string, int>("sdertppswedertyuqrt", 1));
    testmap.insert(make_pair<string, int>("qwerzzx", 1));
    testmap.insert(make_pair<string, int>("qwerzzxasdf", 1));
    testmap.insert(make_pair<string, int>("qwsdfgqwerzzx", 1));
    testmap.insert(make_pair<string, int>("xcvbqwsdfgqwerzzx", 1));
    testmap.insert(make_pair<string, int>("xcvbqwsdersdfgqwerzzx", 1));
    poslow = testmap.lower_bound("qw");
    posup = testmap.upper_bound("qw");
    cout<<"Lower POS  ::: "<<poslow->first<<" UPPER POS :: "<<posup->first<<"\n";
    testmap.erase(poslow, posup);
}
4

2 に答える 2

4

上限は、シーケンスをソートしたまま、引数を挿入できる最後の位置を示します(一方、lower_boundは、そのような最初の位置を示します)。「qw」は辞書式順序で「qwerzzx」よりも小さいため、これはその単語の下限と上限の両方です。

言い換えると、[lower_bound, upper_bound)は引数に等しい要素の間隔であり、この場合は空です。

この接頭辞が付いた最後の単語を見つけることが目的の場合は、最後にいくつかの文字を追加して、マップ内の最後の単語よりも辞書式に大きいことを確認できます。たとえば、アルファベット文字しかない場合は'z'、ASCIIテーブルの直後の文字を検索して、「qw」に追加できます。このようにして、あなたの場合、「xcvbqwsdfgqwerzzx」へのイテレータを取得できるはずです。

于 2012-10-11T15:43:25.267 に答える
2

上限は、検索キーより大きいアイテムを返します。下限は、以上のアイテムを返します。この場合、マップには同じものがないため、両方とも同じです。

目的は、両方とも、アイテムが前に挿入され、ソートされた順序を保持できる位置を返すことです。lower_bound範囲の前にupper_bound置き、最後に置きます。

于 2012-10-11T15:43:59.103 に答える