• C++ STL部分

1.     各个容器的比较:vector[连续内存],list[双向链表],剩下的stack,heap,deque可以基于以上容器;rb_tree based的关联容器!BJ说,应该坚决使用vector,[流汗了],后面还有一句话“除非数据量决定了另一种选择”;好嘛,以后坚决支持,既然大牛都如此在意换入换出的效率![76条]
2.     使用vector和string::c_str与非c++API交互,不要问为什么,看下vector的实现就明白了[78条]
3.     这条让我流汗,我无知了大名鼎鼎的boost里面shared_ptr,不晓得是什么东西!暂时忽略这条,在容器中只存储值和智能指针[shared_ptr]!
4.     push_back按指数级扩大容量,拷贝一次[80条]
5.     多用范围操作[vector::insert(position, first::iterator, last::iterator)],少用单元素操作[我想也适用于多用算法unintialized_copy(),unintialized_fill_n()吧],对于连续内存[allocator<T>,new[]->vitrualAllocate等],当然少移动存在元素的好![81条]
6.     这条又让我流汗了
    "erase-remove“ 法则,c.erase(remove(c.begin(),c.end(), value), c.end()),读懂remove和erase方法!remove是移动值的位置[翻下STL实现,再评价],erase才能将dirty的值真正删掉;
    "magic swap" 法则,containter<T>(c).swap();containter<T>().swap(c)用来压缩容量,没用过,不过先放这里!当然s.reverse(0)以及string(s.begin(),s.end()).swap(s),用来优化!
     加上一条vector什么时候才初始化!想清楚再写代码
     再加一条和JAVA一样,STL也存在所谓的"dirty iterator",你说呢?remove(),erase()都会使得当前iterator无效;还记得J2SE里面的法则么?当你用iterator.remove()之后,还能继续使用么?该如何做呢?[iterator.next()跳过,问题还是有滴!]虽然我很恨JAVA,不过调试JXTA的bugs还是不得不抓出这个臭虫!

Sample:

deque<double>::iterator current=d.begin();
for(size_t i=0; i<max; i++){
   current=d.insert(current, data[i]+41);
   current++;
}
//还是用这个吧
transform(data.begin(),data.end(),inserter(d,d.begin(),bind2nd(plus<double>(),41)));//OK
transform(data,data+max,inserter(d.d.begin())+41);//还是忘了吧!

 
  • 算法部分:
    早晨头好痛,把中位数O(N)算法,油田分布!动规分析了两道题目!
    递归的一道神题
    搜索的实现[入门的三道题]

好了,继续写算法的代码了!

Advertisements