读书人

删除vector结构体元素的有关问题静待

发布时间: 2012-05-13 16:39:43 作者: rapoo

删除vector结构体元素的问题,静待高手出现……
我有如下vector:
typedef struct structWindow
{
CString title;
int sate;
}Windows;
typedef std::vector<Windows> windows;
windows m_listWindows;

Windows w,w1,w2,w3;
w.title=title;
w.sate=1;
m_listWindows.push_back(w);
……
m_listWindows.push_back(w1);
……
m_listWindows.push_back(w2);

现在需要写一个函数(如DelN(Windows & w))从m_listWindows中删除参数指定的一个元素,该如何写?

[解决办法]
xx.erase(remove_if(xx.begin(),xx.end(),bind2nd(std::equal_to<int>(),w)),xx.end());
operator == 由你自己提供。
[解决办法]
上面类型错了
这个可以提供其他相等策略
xx.erase(remove_if(xx.begin(),xx.end(),bind2nd(std::equal_to<windows::value_type>(),w)),xx.end());

如果用默认的operator == 这个简单点。
xx.erase(remove(xx.begin(),xx.end(),w),xx.end());

[解决办法]
[code=C/C++][/code]
//---------------------------------------
//--------------实例列表---------------------------
template<class T>
class TGeneralListCustom
{
public:
int GetCount(void);
T *GetItem(POSITION AIndex);
T *GetItem(int AIndex);
void Delete(POSITION AIndex); //删除一类
void DeleteALL();
void Remove(T *AItem);
void RemoveAtWrite(T *AItem);
POSITION IndexOf(T *AItem); //查找某一类的索引
POSITION BeginOf();
POSITION EndOf();
void GetNext(POSITION& r);
void GetPrev(POSITION& r);
void Clear(void); //清除所有类并释放内存
void RemoveAll(); //清除所有类的对象
TGeneralListCustom();
virtual ~TGeneralListCustom(void);
T *AddItem(T *AT);
protected:
CPtrList *FList;
};
template<class T>
TGeneralListCustom<T>::TGeneralListCustom()
{ //构造
FList = new CPtrList();
}
template<class T>
TGeneralListCustom<T>::~TGeneralListCustom(void)
{ //析构
Clear();
if(FList != NULL)
delete FList;
}
template<class T>
int TGeneralListCustom<T>::GetCount(void)
{ //返回个数
INT_PTR r;
r=FList->GetCount();
return r;
}
template<class T>
T *TGeneralListCustom<T>::GetItem(POSITION AIndex)
{ //返回一个元素(失败返回NULL)
T *r;
void *IV;
try
{
// if(AIndex <= FList->GetTailPosition())
// {
IV=FList->GetAt(AIndex);
r=(T *)IV;
// }
// else
// {
// r=NULL;
// }
return r;
}
catch(...)
{
return NULL;
}
}
template<class T>
T *TGeneralListCustom<T>::GetItem(int AIndex)
{ //返回一个元素(失败返回NULL)
T *r;
try
{
POSITION pos = FList->GetHeadPosition();
for(int i=0;i < AIndex; i++)
{
GetNext(pos);
}
r = GetItem(pos);
return r;
}
catch(...)
{
return NULL;
}
}
template<class T>
T *TGeneralListCustom<T>::AddItem(T *AT) //加入列表
{
FList->AddTail(AT);
return AT;
}
template<class T>
void TGeneralListCustom<T>::Delete(POSITION AIndex) //删除一元素
{
T *IOne;
IOne=GetItem(AIndex);
if(IOne!=NULL)
{
FList->RemoveAt(AIndex);
delete IOne;
}
}

template<class T>
void TGeneralListCustom<T>::RemoveAtWrite(T *AItem) //删除一元素
{
POSITION r;
r=FList->Find(AItem);
if(r != NULL)
{//有找到
FList->RemoveAt(r);
}
}

template<class T>
void TGeneralListCustom<T>::DeleteALL() //删除所有元素


{
T *IOne;
POSITION pos = FList->GetTailPosition();
while(pos != FList->GetHeadPosition())
{
IOne=GetItem(pos);
if(IOne!=NULL)
{
FList->RemoveAt(pos);
delete IOne;
IOne = NULL;
}
GetPrev(pos);
}
if(FList->GetTailPosition() == FList->GetHeadPosition() && FList->GetCount() > 0)
{
IOne=GetItem(pos);
FList->RemoveAt(pos);
if(IOne != NULL)
delete IOne;
IOne = NULL;
}
}
template<class T>
void TGeneralListCustom<T>::Remove(T *AItem)
{
POSITION r;
r=FList->Find(AItem);
if(r != NULL)
{//有找到
Delete(r);
}
}
template<class T>
POSITION TGeneralListCustom<T>::IndexOf(T *AItem) //查找某一类的索引
{
POSITION r;
r=FList->Find(AItem);
return r;
}
template<class T>
POSITION TGeneralListCustom<T>::BeginOf() //查找某一类的索引
{
POSITION r;
r=FList->GetHeadPosition();
return r;
}
template<class T>
POSITION TGeneralListCustom<T>::EndOf() //查找某一类的索引
{
POSITION r;
r=FList->GetTailPosition();
return r;
}
template<class T>
void TGeneralListCustom<T>::GetNext(POSITION& r) //查找某一类的索引
{
FList->GetNext(r);
}
template<class T>
void TGeneralListCustom<T>::GetPrev(POSITION& r) //查找某一类的索引
{
FList->GetPrev(r);
}
template<class T>
void TGeneralListCustom<T>::Clear(void) //清除所有类
{
FList->RemoveAll();
}
template<class T>
void TGeneralListCustom<T>::RemoveAll() //清除所有类
{
FList->RemoveAll();
}
[解决办法]
你要为Windows实现一个==操作符重载,用于std:find去查找。

如果你自己查找,比如:
for (std::vector<Windows>::iterator iter = xx.begin(); iter < xx.end(); ++iter)
{
if (...) //找到
{
xx.erase(iter);
break; //不存在重复,可以这样
}
}

如果vector里面可重复,则在遍历的时候删除,要小心了,应该这样:
for (std::vector<Windows>::iterator iter = xx.begin(); iter < xx.end();)
{
if (...)
iter = xx.erase(iter);
else
++iter;
}

如果你的编译器版本很低,iter = xx.erase(iter);这句可能无法编译,则改如下:
xx.erase(iter);
即可。

[解决办法]
vector::erase
[解决办法]

探讨
我是在MFC环境下,怎么出现:
“remove”: 函数不接受 3 个参数

[解决办法]
http://blog.163.com/happyboy200032/blog/static/46903113201151641358149
http://blog.163.com/happyboy200032/blog/static/4690311320115283491987
[解决办法]
探讨
你要为Windows实现一个==操作符重载,用于std:find去查找。

如果你自己查找,比如:
for (std::vector<Windows>::iterator iter = xx.begin(); iter < xx.end(); ++iter)
{
if (...) //找到
{
xx.erase(iter);
break; //不存在重复,可以这样
}
}

……

读书人网 >VC/MFC

热点推荐