STL之vector的使用四(vector的查找、空、及其它技巧)
判断vector是否为空
在判断容器是否为空的时候,使用empty()来代替size()是否为了0的检查方式,因为empty更加高效时间复杂度是常数时间的,size()时间复杂度不是常数时间的。
原则:使用empty判断标准容器是否为空
vector中的查找
原则:尽量使用标准容器自带的算法代替公共算法。
但是vector中并没有多少自己的算法,倒是list中有remove ,remove_if,sort,reverse等算法。
find
find_if
使用交换技巧来修正过剩的容量
vector<int> v1;
//…初始化v1
//…删除v1中所有的元素
但是这个时候v1的内存容量并不是0,还是很大的一块内存没有释放,如果想清空
用v1.reserve(0);到不到目标,因为reserve只能扩大内存容量,并不能减小。
vector<int> v2;
v2.swap(v1);
这个时候就是真的将之内存容量降到最低了。
题外话:使用算法及其他技巧
原则:不要使用auto_ptr作为模板参数来建立容器,这会产生意想不到的陷阱,因为auto_ptr的拷贝有特殊的语义
原则:避免使用vector<bool>, 因为它不能当作标准容器来用
copy
find_if
for_each
原则:尽量使用区间成员函数代替它们的单元素参数兄弟成员函数
区间构造
区间删除
区间赋值
区间插入
原则:使得容器中元素的拷贝操作轻量而正确,拷贝是STL中容器的运行的基本方式,将元素加入到容器,必然保持一个拷贝,容器中的元素不再是原来的那个元素,所以如果将指针加入容器,必须在容器离开作用域以前删除指针所指的对象。
[cpp]
void fun()
{
vector<object*> v1;
……//插入操作
for( vector<object*> :: iterator i = v1.begin(); i != v1.end(); ++i )
{
delete *i;
}
}
[/cpp]
原则:注意对于 vector,任何插入删除操作都会引起迭代器失效。所以要小心。