STL容器vector删除指定索引位置的元素 - 小众知识

STL容器vector删除指定索引位置的元素

2015-11-06 06:46:25 苏内容
  标签: vector/STL/容器
阅读:6016

如果我这么写
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());

扩展阅读
相关阅读
© CopyRight 2010-2021, PREDREAM.ORG, Inc.All Rights Reserved. 京ICP备13045924号-1