您的位置:首页 > 其它

STL学习(四)阶段简单总结

2013-05-31 16:44 204 查看
特别注意

1.在使用容器的时候,最好不要自己写循环

deque

deque也采用动态数组来管理内存,而且动态数组头尾都开放,操作上也与vector几乎一样。下面是与vector相比不同的地方。

1.在存取元素的时候,deque的内部结构会多一个间接过程,所以元素的存取和迭代器的动作会稍微慢一些。

2.deque可以内含更多元素,因为它使用不止一块内存,因此deque的max_size可能更大。

set

1.使用set.lower_bound(elem)的时候最好先判断elem是否在set内,如果是upper_bound(elem),如果这个elem是最后一个元素,那么会返回一个无意义的数值。

2.set使用红黑树来实现,使用set自己的find函数效率比STL算法的find效率要高很多。

vector

1.++vector和--vector不能有效的使用。

function object

1.当容器重视对象实体时候用mem_fun_ref,容器中是对象指针的时候用mem_fun

algorithms

1.尾词_if一般带尾词的最后一个参数为仿函数,而不带尾词的为值,如find()和find_if()。_copy带尾词的一般会复制到目标区间

序列式容器与关联式容器的erase()函数返回值不同:

序列容器提供的erase()成员函数如下:

iterator erase(iterator pos);

iterator erase(iterator beg, iterator end);

关联式容器的erase()容去成员函数如下:

void erase(iterator pos);

void erase(iterator beg, iterator end);

存在这种差别完全是为了性能。在关联式容器中,底层是以二叉树来实现的,“搜寻某元素并后回后继”元素可能颇为耗时。如果写对所有容器都适用的代码,必须忽略返回值。

发现问题(SGI STL与PJ STL不同之处,在vc上无法编译,在suse10上可以编译运行)

1.《C++标准程序库》p210——在使用make_pair来添加multimap<string, string> StrStrMMap的时候,如果直接用StrStrMMap.insert("abc", "def"),虽然编译过程不会出错,但用iterator访问的时候就会出错,初始化的时候改成StrStrMMap.insert(string("abc"), string("def"))就不会出错。

2.《C++标准程序库》p187——set的构造函数,在vc6.0中没有自动改变排序准则的构造函数。不能把一个降序的set构造一个升序的set。(SUSE中使用ostream_iterator要包含iterator头文件)

3.《C++标准程序库》p309:“被const_fun_ref和const_fun调用的成员函数必须是const,C++标准库不针对non-const成员函数提供函数配接器”,但VC6.0中const成员函数编译不会通过,反而non-const成员函数通过编译并运行,而且msdn上的例子也是支持的non-const成员函数。

4.《C++标准程序库》p308:for_each(coll.begin(), coll.end(),bind2nd(mem_fun_ref(&Person::printWintPrefix),"person: "));编译不通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: