向量迭代器失效

Vector iterator invalidation

本文关键字:失效 迭代器 向量      更新时间:2023-10-16

我遇到了一个问题,我认为这是因为迭代器无效。然而,我使用erase()中的迭代器来继续迭代其他结构。当我第一次调用erase()后尝试增加erase()时,我得到以下错误

'vector迭代器不可递增'

std::map<uint32_t, std::vector<std::pair<boost::uuids::uuid, tvshared::SecureIPCCallbackHandlePtr>>>::iterator itMap;
std::vector<std::pair<boost::uuids::uuid, tvshared::SecureIPCCallbackHandlePtr>>::iterator itVector;
{
    tvstd::lock_guard_mutex l(m_ConnectionsMutex);
    itMap = m_Connections.find(static_cast<uint32_t>(pcp->ProcessID()));
    if (itMap != m_Connections.end())
    {
        for (itVector = itMap->second.begin(); itVector != itMap->second.end(); ++itVector)
        {
            if (commadUUID == itVector->first)
            {
                itVector->second.reset();
                itVector = m_Connections[static_cast<uint32_t>(pcp->ProcessID())].erase(itVector);
            }               
        }
    }
}

有人能看出我错在哪里吗?

erase返回一个迭代器,该迭代器指向被函数调用擦除的最后一个元素后面的元素的新位置。如果该操作删除了序列中的最后一个元素,则为容器端。

所以如果你擦除你不需要增加你的迭代器

 for (itVector = itMap->second.begin(); itVector != itMap->second.end(); )
    {
        if (commadUUID == itVector->first)
        {
            itVector->second.reset();
            itVector = m_Connections[static_cast<uint32_t>(pcp->ProcessID())].erase(itVector);
        }
      else
      {
           ++itVector
      }               
 }

这解决了我的问题,我只需要在我擦除后调用break,但一旦我擦除,我不需要循环到列表的末尾。(@ alexander解决方案也有效)

std::map<uint32_t, std::vector<std::pair<boost::uuids::uuid, tvshared::SecureIPCCallbackHandlePtr>>>::iterator itMap;
std::vector<std::pair<boost::uuids::uuid, tvshared::SecureIPCCallbackHandlePtr>>::iterator itVector;
{
    tvstd::lock_guard_mutex l(m_ConnectionsMutex);
    itMap = m_Connections.find(static_cast<uint32_t>(pcp->ProcessID()));
    if (itMap != m_Connections.end())
    {
        for (itVector = itMap->second.begin(); itVector != itMap->second.end(); ++itVector)
        {
            if (commadUUID == itVector->first)
            {
                itVector->second.reset();
                itVector = m_Connections[static_cast<uint32_t>(pcp->ProcessID())].erase(itVector);
                break;
            }
        }
    }
}