#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct _WinHandleInfo
{
int posId;
_WinHandleInfo(int id)
{
posId = id;
}
bool operator==(_WinHandleInfo *p_stOther)
{
return posId == p_stOther->posId;
}
}WinHandleInfo;
static bool SortFun(WinHandleInfo *pHandle1, WinHandleInfo *pHandle2)
{
return pHandle1->posId < pHandle2->posId;
}
vector<WinHandleInfo*> m_idleWinHandleVec;
void SortIdleWinHandle()
{
std::sort(m_idleWinHandleVec.begin(), m_idleWinHandleVec.end(), SortFun);
}
int main()
{
WinHandleInfo *info1 = new WinHandleInfo(5);
m_idleWinHandleVec.push_back(info1);
WinHandleInfo *info2 = new WinHandleInfo(4);
m_idleWinHandleVec.push_back(info2);
WinHandleInfo *info3 = new WinHandleInfo(3);
m_idleWinHandleVec.push_back(info3);
WinHandleInfo *info4 = new WinHandleInfo(2);
m_idleWinHandleVec.push_back(info4);
WinHandleInfo *info5 = new WinHandleInfo(1);
m_idleWinHandleVec.push_back(info5);
for (auto info = m_idleWinHandleVec.begin();info!=m_idleWinHandleVec.end();info++)
{
printf("%d ",(*info)->posId);
}
printf("\r\n====================\r\n");
SortIdleWinHandle();
for (auto info = m_idleWinHandleVec.begin();info!=m_idleWinHandleVec.end();info++)
{
printf("%d ",(*info)->posId);
}
printf("\r\n====================\r\n");
remove(m_idleWinHandleVec.begin(),m_idleWinHandleVec.end(),info4);
for (auto info = m_idleWinHandleVec.begin();info!=m_idleWinHandleVec.end();info++)
{
printf("%d ",(*info)->posId);
}
printf("\nremove size:%d\n",m_idleWinHandleVec.size());
printf("\r\n====================\r\n");
m_idleWinHandleVec.erase(remove(m_idleWinHandleVec.begin(),m_idleWinHandleVec.end(),info5),m_idleWinHandleVec.end());
for (auto info = m_idleWinHandleVec.begin();info!=m_idleWinHandleVec.end();info++)
{
printf("%d ",(*info)->posId);
}
printf("size:%d\n",m_idleWinHandleVec.size());
system("pause");
return 0;
}
結果
關鍵點:
1. sort排序vector
2. vector remove函數,只會把後面的元素向前移動,相當於向前一位內存覆蓋,最後一個元素的內存還在,vector的元素個數也沒有發生變化
3.earse 結合 remove,做到真正刪除,先移位,再把最後一個元素抹掉