2

キーがペアであるマップがありますstd::map<std::pair<int, int>, struct A> myMap。ペアの一意の最初の要素ごとに最も低いペアを見つけてアクセスするにはどうすればよいですか? 例えば、

struct A a;
myMap.insert(std::make_pair(std::pair<int, int>(1, 200), a));
myMap.insert(std::make_pair(std::pair<int, int>(1, 202), a));
myMap.insert(std::make_pair(std::pair<int, int>(2, 198), a));
myMap.insert(std::make_pair(std::pair<int, int>(2, 207), a));

使用したいキーは、<1, 200> と <2, 198> です。それらを一緒に返す必要はありません。それぞれに対して操作を行う必要があるだけです。

御時間ありがとうございます!

4

4 に答える 4

0

カスタムコンパレータを使用できます

struct comp {
bool operator()(const std::pair<int, int>&x, const std::pair<int, int>& y ) const
{
    return x.second < y.second;
}
};

std::map<std::pair<int, int>, struct A,comp > myMap;

そして、find_ifペアの最初の要素を見つけて使用します。

あなたの場合、std::less<T>デフォルトでは期待どおりにソートされます。

したがって、以下はカスタムコンパレータなしで機能します。

std::map<std::pair<int, int>, struct A > myMap;

int search_id=1; //First Element of pair, you can use entire pair too, 
//but that will defeat the purpose of "lowest pair"
auto it=std::find_if(myMap.begin() , myMap.end() , 
                [search_id](const std::pair<std::pair<int, int>, A>& x)
                { return x.first.first == search_id; } 
                );

if(it != myMap.end())
{
std::cout<<it->first.first<<" "<<it->first.second;
}

編集:すべての要素をループする関数として使用できます

于 2013-09-21T19:27:02.223 に答える