STL之vector的使用四(vector的查找、空、及其它技巧)

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,任何插入删除操作都会引起迭代器失效。所以要小心。