1.循環(huán)中刪除map元素的寫法
typedef map<int,int> mymap;
typedef map<int,int>::iterator myiter;
mymap m;??? m[1] = 2;??? m[2] = -1;??? m[3] = 3;??? m[4] = 0;??? m[5] = -5;??? m[6] = 1;
myiter iter = m.begin();
?while(iter!=m.end())???
{
??????? if(iter->second<0)??
??????????? m.erase(iter++);
??????? else???
??????????? ++iter;
}
2.vector<char>來(lái)儲(chǔ)存二進(jìn)制流
3.vector 的at方法會(huì)進(jìn)行邊界檢查,[]操作符則不會(huì)
4.從ifstream讀出一行到string,使用std::getline(ifstream的成員函數(shù)getline做不到)
5.警惕string的引用記數(shù)技術(shù)實(shí)現(xiàn)帶來(lái)的潛在問(wèn)題
string greet("Hello, world");
string hi(greet);
char *ptr = (char *)hi.c_str();
ptr[0] = 'h';
兩個(gè)字符串都被修改。
在多線程之間引用多個(gè)有關(guān)系的string,可能導(dǎo)致引用計(jì)數(shù)失效,造成多次刪除,或者memory leak.
保險(xiǎn)的做法是:
string s1("hello") ; string s2 (s1.c_str()); //force copy
避免iterator失效,不提取無(wú)效的iterator
比如:
vector<int> iv;
vector<int>::iterator end = iv .end();
for(int i=0;i<10;++i)
??? iv.insert(end,i);
會(huì)crash ,因?yàn)閑nd指針,隨著insert后可能失效
改為:
vector<int> iv;
for(int i=0;i<10;++i)
??? iv.insert(iv.end(),i);
或者:
vector<int> iv;
for(int i=0;i<10;++i)
??? iv.push_back(i); //prefer
?