CMapStringToString myMap;//假设已经存入数据POSITION pos = myMap.GetStartPosition();
while(pos)
{
CString s1;
CString s2;
myMap.GetNextAssoc(pos, s1, s2);
CString s3;
if(myMap.Lookup(s2,s3) && s3 == s1)
{
myMap.RemoveKey(s1);
myMap.RemoveKey(s2);
}}由于上面的RemoveKey操作是在遍历里面的,而且还会将当前的Key删除,这样子的遍历能便利到最后吗?
如果可以的话,能不能请各位大虾说一下原因(因为我总觉得pos地址会出错,比如pos中的指针正好指向的是Key为S2的数据的时候,不知道是不是我想多了)
如果不行的吧,以上这种操作应该怎么去实现呢?
如果万一我删除的下一个节点正好是pos所指向的节点呢?
2. 你自己要保证不会删除下一个节点.
怎样保证删除的节点不是下一个节点?
这个时候是要找POS节点上的key内容,如果是被删除节点就找下个节点?
我上面的例子只是两个值,万一是很多值的怎么进行处理?(就是我一次删除好多节点,但是每个都恰恰好是上个节点的下个节点呢? (是不是我想多了 ?))
void CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::GetNextAssoc(POSITION& rNextPosition,
KEY& rKey, VALUE& rValue) const
{
ASSERT_VALID(this);
ENSURE(m_pHashTable != NULL); // never call on empty map CAssoc* pAssocRet = (CAssoc*)rNextPosition;
ENSURE(pAssocRet != NULL); if (pAssocRet == (CAssoc*) BEFORE_START_POSITION)
{
// find the first association
for (UINT nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
{
if ((pAssocRet = m_pHashTable[nBucket]) != NULL)
{
break;
}
}
ENSURE(pAssocRet != NULL); // must find something
} // find next association
ASSERT(AfxIsValidAddress(pAssocRet, sizeof(CAssoc)));
CAssoc* pAssocNext;
if ((pAssocNext = pAssocRet->pNext) == NULL)
{
// go to next bucket
for (UINT nBucket = (pAssocRet->nHashValue % m_nHashTableSize) + 1;
nBucket < m_nHashTableSize; nBucket++)
if ((pAssocNext = m_pHashTable[nBucket]) != NULL)
break;
} rNextPosition = (POSITION) pAssocNext; // fill in return data
rKey = pAssocRet->key;
rValue = pAssocRet->value;
}