Vector中删除的问题

ymy1986 2010-07-28 05:14:16
在对话框工程中,添加了一个vector<TCHAR*>的变量,用来存放动态分配内存数组的地址,当我想删除其中的某一项时应该用什么函数,是在ListBox中选择然后再删除,可以得到ListBox中的索引号,可以用这个索引号配合Vector的响应函数来删除Vector中的一项吗?不想使用迭代器。应该怎么做啊?最好是具体一点,谢谢大家了。
...全文
2667 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
nbnb999 2012-10-16
//若是最后一个可用array.pop_back()

-------------------

删除所有偶数项,并打印出删除的项
1. vector/queue
正确方法1:
void erase(vector<int> &v)
{
for(vector<int>::iterator vi=v.begin();vi!=v.end();)
{
if(*vi % 2 == 0)
{
cout << "Erasing " << *vi << endl;
vi = v.erase(vi);
}
else ++vi;
}
}

正确方法2:
void erase2(vector<int> &v)
{
for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
{
if(*ri % 2 == 0)
{
cout << "Erasing " << *ri << endl;
v.erase((++ri).base()); //erase()函数期待的是正向iterator,故而这里要调
//用base()函数将逆向iterator转换为正向的
}
else ++ri;
}
}

回复
linfangrong 2011-10-25
13楼方法不行啊~~
vector<TCHAR*> m_vector;
for (vector<TCHAR*>::iterator it = m_vector.begin();it != m_vector.end(); )
{
if (*it == /* 你自己的判断*/)
{
//如果成员是new出来的要delete
if (*it)
{
delete (*it);
(*it) = NULL;
}
it = m_vector.erase(it);
}
else
{
++it;
}
}
回复
windworm 2011-07-08
it = m_vector.erase(it);
回复
xfeng_12 2011-07-05
6楼的方法基本是对了,但是erase之后迭代器指向了下一个位置,再it++就总是漏掉下一个位置的迭代器。
vector<TCHAR*> m_vector;
vector<TCHAR*>::iterator it = m_vector.begin();
for (;it != m_vector.end();it ++)
{
if (*it == /* 你自己的判断*/)
{
//如果成员是new出来的要delete
if (*it)
{
delete (*it);
(*it) = NULL;
}
m_vector.erase(it);
it--; // 加上这一句:更新迭代器位置
}
}
回复
jhayumu 2010-07-28
顶楼上的,其实你也不一定要用VECTOR 玩嘛
回复
Eleven 2010-07-28
[Quote=引用楼主 ymy1986 的回复:]
在对话框工程中,添加了一个vector<TCHAR*>的变量,用来存放动态分配内存数组的地址,当我想删除其中的某一项时应该用什么函数,是在ListBox中选择然后再删除,可以得到ListBox中的索引号,可以用这个索引号配合Vector的响应函数来删除Vector中的一项吗?不想使用迭代器。应该怎么做啊?最好是具体一点,谢谢大家了。
[/Quote]
不想用迭代器,就用数组不就行了
回复
luodx1021 2010-07-28
用std::vector来存放ListBox项,不安全、不可靠,特别是如果ListBox可以删除项的时候,如果是删除列表中某些中间项的时候,vector下标没有办法与ListBox再次全部正确关联。只能够通过vecotr中存放的具体内容与列表的内容来关联,这是不合理的,因为很多时候,vecotr中可以存放内容相同的项。

你可以换一种容器来存放,通过std::map<int, TCHAR*>来和ListBox项关联。
将map的int键值设置为ListBox的ItemData,这样就可以正确的来处理ListBox了。
回复
stonewater 2010-07-28
free(*(vect.begin()+index));
vect.erase(vect.begin()+index);//
回复
stonewater 2010-07-28
删除之前要先free内存
回复
stonewater 2010-07-28

vect.erase(vect.begin()+index);//index为索引号
回复
bragi523 2010-07-28
vector<TCHAR*> m_vector;
vector<TCHAR*>::iterator it = m_vector.begin();
for (;it != m_vector.end();it ++)
{
if (*it == /* 你自己的判断*/)
{
//如果成员是new出来的要delete
if (*it)
{
delete (*it);
(*it) = NULL;
}
m_vector.erase(it);
}
}
回复
vc1000 2010-07-28
iterator erase(iterator it);
回复
gamedragon 2010-07-28
vector有什么函数查查不就知道了。
remove就行了,参数就是个iterator
回复
ymy1986 2010-07-28
还有就是为什么removeElementAt提示不是Vector的函数啊?
回复
ymy1986 2010-07-28
[Quote=引用 1 楼 bragi523 的回复:]

肯定要用迭代器吧
[/Quote]

如果必须用迭代器该怎么写啊?
回复
bragi523 2010-07-28
肯定要用迭代器吧
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告