方法一:
std::mapmaptest;
bool testval(const std::string & val);
......
std::map::iterator it = maptest.begin();
while(it != maptest.end())
else
it++;
}...........
在這種方式中,通過std::map的erase方法在釋放了it後會返回指向下乙個元素的指標來獲取最新的iterator。
方法二:
std::mapmaptest;
bool testval(const std::string & val);
......
std::map::iterator it = maptest.begin();
while(it != maptest.end())
else
it++;
}...........
該方法中利用了後++的特點,這個時候執行maptest.erase(it++);這條語句分為三個過程
1、先把it的值賦值給乙個臨時變數做為傳遞給erase的引數變數
2、因為引數處理優先於函式呼叫,所以接下來執行了it++操作,也就是it現在已經指向了下乙個位址。
3、再呼叫erase函式,釋放掉第一步中儲存的要刪除的it的值的臨時變數所指的位置。
如果只是maptest.erase(it); 當這條語句執行完後,it就是乙個非法指標,如果再執行++就會出錯
總結,雖然上面兩種方法達到了乙個相同的效果,但是,更提倡使用第二種,第一種方法只適用於windows平台,並不是標準庫的支援
std map erase的用法及陷阱
方法一 cpp view plain copy std mapmaptest bool testval const std string val std map iterator it maptest.begin while it maptest.end else it 在這種方式中,通過std m...
typedef的用法及建構函式的用法
主要用法給資料型別新加乙個名字 例一 例二,include typedef int zhangsan 為int再重新多取乙個名字,zhangsan等價於int typedef struct student st 為struct student重新多取乙個名字,叫st int main include...
explicit的用法及意義
c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面所示 class myclas...