簡體   English   中英

C ++ std :: map和std :: pair <int, int> 作為關鍵

[英]C++ std::map and std::pair<int, int> as Key

我有以下C ++代碼:

struct MyStruct
{
    int a[2];
    int b[2];
};

std::map<std::pair<int, int> , MyStruct*> MyMap;

現在,我在MyMap上運行以下循環:

for(std::map<std::pair<int, int> , MyStruct*>::iterator itr = MyMap.begin(); itr != MyMap.end(); ++itr)
{
    std::pair<int, int> p (itr->first().second, itr->first().first);
    auto i = MyMap.find(p);
    if(i != MyMap.end())
    {
        //do something
    }
}

我實際上想做的是通過交換另一對元素來形成一個對,例如,我在MyMap中有一個密鑰對(12,16),還有另一個密鑰對(16,12); 這兩個密鑰存在於MyMap中,我肯定知道。 但是當我應用上述技術MyMap時,不返回與交換的鍵相對應的值,我猜測MyMap.find(p)與Key的指針匹配; 但是有一種方法可以強制MyMap.find(p)匹配Key(對)中的對應值,而不是匹配Key(對)中的指針嗎? 還是我在這里做錯了什么?

您的代碼中有一些不精確的地方,例如,您的MyStruct沒有復制構造函數,但是包含數組,for循環中的itr->first() ,而first沒有調用運算符,等等。 以下代碼可以滿足您的要求:

#include <array>
#include <map>
#include <utility>
#include <memory>
#include <stdexcept>
#include <iostream>

struct MyStruct
{
    std::array<int, 2> a;
    std::array<int, 2> b;
};

template <class T, class U>
std::pair<U, T> get_reversed_pair(const std::pair<T, U>& p)
{
    return std::make_pair(p.second, p.first);
}

int main()
{
    std::map<std::pair<int, int>, std::shared_ptr<MyStruct>> m
    {
        {
            {12, 16},
            std::make_shared<MyStruct>()
        },
        {
            {16, 12},
            std::make_shared<MyStruct>()
        }
    };

    std::size_t count = 1;

    for(const auto& p: m)
    {
        try
        {
            auto f = m.at(get_reversed_pair(p.first));
            f -> a.at(0) = count++;
            f -> b.at(0) = count++;
        }
        catch(std::out_of_range& e)
        {

        }
    }

    for(const auto& p: m)
    {
        std::cout << p.first.first << ' ' << p.first.second << " - ";
        std::cout << p.second -> a.at(0) << ' ' << p.second -> b.at(0) << std::endl;
    }

    return 0;
}

輸出:

12 16 - 3 4
16 12 - 1 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM