C++ STL容器中循环删除时erase的使用
主要是看不同容器在C++98和C++11的不同表现序列化容器C++98和C++11的vector的erase()接口没啥使用区别从简单的测试例子讲解vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);for (vector<int>::iter...
主要是看不同容器在C++98和C++11的不同表现
序列化容器
C++98和C++11的vector的erase()接口没啥使用区别
从简单的测试例子讲解
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
for (vector<int>::iterator iter = vec.begin(); iter != vec.end();)
{
if (*iter == 2)
{
vec.erase(iter++); //1运行完:iter——0x014E5078
// iter = vec.erase(iter); //2运行完:iter—0x014E5074
}
else
{
iter++;
}
};
没有具体去看erase()函数的实现,看内存变化,应该是把删除的数据之后的数据整体前移,对应的end()迭代器前移。
1vec.erase(iter++) 为什么不行呢,是因为iter是在原来的迭代器上++,而vector执行erase()之后内存发生变化,导致原有迭代器失效。iter指向和end()一致,异常报错。
序列化容器,erase()会导致原有迭代器失效,循环删除只能使用 iter = vec.erase(iter)
关联性容器
执行erase()之后,关联性容器的迭代器并不失效,所以可以使用map.earse(iter++)
set、map
C++98
map和set的earse()返回值void
只能使用 map.earse(iter++)
C++11
map.earse返回值是删除的迭代器的下一个
所以可以使用 iter = map.earse(iter)
也可以使用 map.earse(iter++)
list
C++98,C++11
返回值是删除的迭代器的下一个:An iterator pointing to the element that followed the last element erased by the function call. This is the container endif the operation erased the last element in the sequence.
两种删除方法都可以
iter = map.earse(iter)
map.earse(iter++)
END
PS: 推荐一个在线C++文档查询网站:STL容器查询
更多推荐
所有评论(0)