Vector 其實(shí)就類似動(dòng)態(tài)數(shù)組. 事先分配好一定量的內(nèi)存. 當(dāng)需要的內(nèi)存值大于某個(gè)閥值. 就重新申請(qǐng)內(nèi)存. 重新分配. 當(dāng)小于某個(gè)閥值, 也會(huì)導(dǎo)致重新分配.(自動(dòng)收縮部分, stl沒有明確規(guī)定, 有些庫實(shí)現(xiàn)了)
正確: code1
vector<string> vecFiles;
vector<string>::iterator it_pos;
//@todo 已下載文件過濾
for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); ) {
string strTmp = *it_pos;
if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判斷是否已下載過, 已下載則從列表刪除
g_Log << TIME << "file:[" << *it_pos << "] found "<< END; //
vecFiles.erase(it_pos++);
}else
it_pos++;
}
正確: code2
vector<string> vecFiles;
vector<string>::iterator it_pos;
//@todo 已下載文件過濾
for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); ) {
string strTmp = *it_pos;
if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判斷是否已下載過, 已下載則從列表刪除
g_Log << TIME << "file:[" << *it_pos << "] found "<< END; //
it_pos = vecFiles.erase(it_pos);
}else
it_pos++;
}
錯(cuò)誤: code3
vector<string> vecFiles;
vector<string>::iterator it_pos;
//@todo 已下載文件過濾
for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); it_pos++) {
string strTmp = *it_pos;
if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判斷是否已下載過, 已下載則從列表刪除
g_Log << TIME << "file:[" << *it_pos << "] found "<< END; //
vecFiles.erase(it_pos);
}
}
code3 錯(cuò)誤的原因?yàn)? vecFiles.erase(it_pos); 當(dāng)前的it_pos已經(jīng)被刪除了, 再下一次循環(huán)的時(shí)候 it_pos++, 訪問非法內(nèi)存..
然后回過頭來看code1, vecFiles.erase(it_pos++); 在當(dāng)前的it_pos已經(jīng)被刪除的時(shí)候, it_pos已經(jīng)指向下一個(gè)位置了. 雖然這里邏輯上是錯(cuò)誤的. 但是利用c語法的特性產(chǎn)生了一個(gè)正確的結(jié)果, 算是一個(gè)技巧. 不算是一門技術(shù).
code2, it_pos = vecFiles.erase(it_pos); erase刪除的時(shí)候, 也返回了下一個(gè)指針的位置,我們將這個(gè)位置保留了, 所以這種做法也是正確的.
另外一個(gè)移植性比較好的做法是remove_if 和一個(gè)仿函數(shù).
仿函數(shù)可以是:
struct check {
check( Object * objDownHis ) : m_obj( objDownHis ) {}
check( const check & c ) : m_obj( c.m_obj ) {}
bool operator()(const string & s) const {
if ( m_obj->checkHisList( s.c_str() ) {
g_Log .........
return true;
}
return false;
}
Object * m_obj;
};
vecFiles.erase( std::remove_if( vecFile.begin(), vecFile.end(), check( &objDownHis ) );
鳴謝p大, lancey, jackz 排名不分先后.. 全按交流時(shí)間順序...