C++ std::map 和 std::p air<int, int> 作为键

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

本文关键字:int std gt map air C++ lt      更新时间:2023-10-16

我有以下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 (pair)中的相应值,而不是匹配Key (pair)中的指针?还是我在这里做错了什么?

您的代码中有一些不精确的地方,例如,您的MyStruct没有复制构造函数,但包含数组,itr->first()在for循环中,而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
相关文章: