向量迭代器失效
Vector iterator invalidation
我遇到了一个问题,我认为这是因为迭代器无效。然而,我使用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;
}
}
}
}
相关文章:
- 不明白迭代器,引用和指针失效,一个例子
- std::vector::erase() 真的会在擦除时使迭代器失效吗?
- 没有迭代器失效是否意味着推进迭代器的有效性?
- C++11 std::列出拼接后的迭代器失效
- 为什么输入迭代器在递增后会使自身失效?
- C++ std::map 和 std::set 擦除复制值,从而使迭代器失效
- 当没有迭代器失效时,这是否包括结束迭代器?
- 为什么在擦除位置之前的矢量的 c++ 迭代器在 Visual Studio 中也失效
- std::map 线程安全和迭代器失效
- 为什么 std::vector 迭代器在 erase() 调用后失效?
- 避免迭代器在向量迭代过程中失效
- 赋值(运算符 =)使容器的迭代器失效
- 递增可变输入迭代器是否会使旧迭代器值失效
- std::list<>::splice 使迭代器失效。理由?
- C++11 中的过去终结迭代器失效
- 在字符串中使用 erase 函数是否会使迭代器失效
- tbb::concurrent_unordered_map::unsafe_erase 是否会使任何现有迭代器失效
- 迭代器与指针(引用)的双插入失效
- 为什么 vector::迭代器在重新分配时失效
- 迭代器失效 - end() 是否算作迭代器