为什么将指针插入 std::map 不起作用?

问题描述 投票:0回答:1

我想将一个指针作为键和一个指针作为值插入到 c++ std::map:

class PlayerConnectionContainer{
    public: 
    std::map<Player*,HSteamNetConnection*> playerConnectionMap;
    std::vector<Player> players;


};

这是将

HSteamNetConnection
参考插入到地图中的方法

void PlayerConnectionContainer::Append(HSteamNetConnection&  connection){

    Player newPlayer; // Creating player object
    players.push_back(newPlayer); // Pushing the object into the vector

    
    std::cout << &players.begin() << "  " << connectionPlayerMap.size() <<  std::endl; // Starting memory address
    connectionPlayerMap.insert(std::make_pair(&connection,&players.begin()));
    std::cout << connectionPlayerMap.begin()->second << "  " << connectionPlayerMap.size()  << std::endl; // Retrived memory address
}

当我运行这个时,我得到以下输出:

0000002A9E8FF2B0  1
0000000000000000  1

我期望获得相同的内存地址,因为地图是空的,我刚刚将这对插入到地图中,但我实际得到的是一个空指针,这似乎令人困惑(而且地图的大小也没有改变) ,表明实际上没有插入任何内容)。 我想,地图可能找不到连接键,但是当运行此搜索时,

if(connectionPlayerMap.find(&connection) == connectionPlayerMap.end())
    std::cout << "Could not be found" << std::endl;

找到连接指针作为键。我知道像这样存储原始指针可能不是一个好主意,但我仍然不明白,为什么这不起作用! 预先感谢!

c++ dictionary pointers nullpointerexception std
1个回答
0
投票

.end()
容器的
std::map
函数(与所有其他STL容器一样)返回到最后一个元素的迭代器!相反,它返回一个“最后一次”的迭代器。尝试取消引用(就像您对 -> 第二个所做的那样)是未定义的行为。

您需要做的是首先递减该迭代器,然后再取消引用它。最安全的方法是使用

std::prev
函数,如下所示:

std::cout << std::prev(connectionPlayerMap.begin())->second << "  " << connectionPlayerMap.size()  << "\n";
© www.soinside.com 2019 - 2024. All rights reserved.