【问题标题】:Vector iterator invalidation向量迭代器失效
【发布时间】:2015-07-31 05:13:07
【问题描述】:

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

'向量迭代器不可递增'

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 调用删除了向量中的最后一个元素会怎样?
  • @T.C.啊,是的,这是因为我在列表的中间擦除,如果我最后这样做会很好......所以我在这里所做的就是在我擦除后暂停。这样就解决了。
  • 另外,第二次查找完全没有必要。只需使用itMap

标签: c++ vector iterator


【解决方案1】:

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
      }               
 }

【讨论】:

    【解决方案2】:

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

    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;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-17
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2017-08-29
      • 2011-04-14
      • 1970-01-01
      相关资源
      最近更新 更多