如果我这么写
vec.erase(vec.begin()+idx);
有木有问题?
谢谢
木有问题,begin()返回的是下标0位置的迭代器,而vector的迭代器是支持+个数字的操作的。不过其他容器就不一定了,主要看那些容器的迭代器支不支持加法运算
if(idx <= vec.size())
{
vec.erase(vec.begin() + idx);
}
如果是循环里面erase是要注意下一个下标
vector窗口只会释放vector自己内部申请的内存, 而不管程序自己申请的内存.
比如你的vector中保存new出来的指针. 那么vector在erase的时候就只释放这个指针占的4字节内存, 而指针指向的内存它是不会释放的.
只要自己保证不越界, 那就是没有问题的.
erase删除元素,不释放内存
你看看capacity(),和size()的值就知道了!
vector如何删除指定索引位置的元素
1、remove并不是删除,仅仅是移除,要加上erase才能完成删除。
2、remove并不是删除指定位置的元素,而移除所有指定的元素。
3、用algorithm代替成员函数不是一个好的选择。
删除的方法:
vec.erase(remove(vec.begin(),vec.end(),value),vec.end());
例:ListBox的添加与删除
变量:
CListBox m_List;
vector<CString> m_str:
//Add:(如果存在则删除旧的)
int nlndex;
while ((nIndex = this->m_List.FindString(nIndex , ...)) != LB_ERR)
{
m_List.DeleteString( nIndex );
if((int)m_str.size()>=nIndex)
{
m_str.erase(remove(m_str.begin(),m_str.end(),m_str[nIndex]),m_str.end());
}
}
m_List.AddString(...);
m_str.push_back(...);
//delete:
int count = m_List.GetSelCount();
int* lpIndex = NULL;
if(count<0)
return;
if (count == 0)
m_List.ResetContent();
lpIndex = new int[count];
m_List.GetSelItems(count,lpIndex);
int num = 0;
for(int i = 0;i<count;i++)
{
int delNum = lpIndex[i];
if(delNum>=num &&num>0)
{
delNum = delNum-num;
}
if((int)m_str.size()>=delNum)
{
m_str.erase(remove(m_str.begin(),m_str.end(),m_str[delNum]),m_str.end());
}
m_List.DeleteString(delNum);
num++;
}
delete []lpIndex;
vector如何删除指定索引位置的元素?
#include <algorithm>
using namespace std;
remove(vec.begin(),vec.end(),value);
指定位置
比如 第5个
如何得到第5个的 iter?
vector<int> vec;
vector<int>::iterator iter = vec.begin()+5;
1、remove并不是删除,仅仅是移除,要加上erase才能完成删除。
2、remove并不是删除指定位置的元素,而移除所有指定的元素。
3、用algorithm代替成员函数不是一个好的选择。
remove只是简单地用"未删除"对象来填补被删除对象留下的缺口,每一个删除对象在尾部还是会留下一个相应的"死亡"对象.
可以这样来使用remove...
vector<int>vec;
vec.erase(remove(vec.begin(),vec.end(),value),vec.end());