[转载]STL的使用时应注意的细节

1.循环中删除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>来储存二进制流


3.vector 的at方法会进行边界检查,[]操作符则不会


4.从ifstream读出一行到string,使用std::getline(ifstream的成员函数getline做不到)

5.警惕string的引用记数技术实现带来的潜在问题
string greet("Hello, world");
string hi(greet);
char *ptr = (char *)hi.c_str();
ptr[0] = 'h';
两个字符串都被修改。

在多线程之间引用多个有关系的string,可能导致引用计数失效,造成多次删除,或者memory leak.
保险的做法是:
string s1("hello") ; string s2 (s1.c_str()); //force copy

避免iterator失效,不提取无效的iterator
比如:
vector<int> iv;
vector<int>::iterator end = iv .end();
for(int i=0;i<10;++i)
    iv.insert(end,i);
会crash ,因为end指针,随着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


 

posted on 2006-10-05 10:35 永遇乐 阅读(892) 评论(1)  编辑 收藏 引用 所属分类: STL & Boost

评论

# re: [转载]STL的使用时应注意的细节 2009-02-18 10:44 yys

map删除元素
m.erase(iter++);
改成iter = m.erase(iter),会更好。

m.erase(iter++),浪费一次++运算
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

常用链接

留言簿(6)

随笔分类

推荐Blog

友情链接

搜索

最新评论

阅读排行榜