C++STL----容器高效使用

1. 容器中对象拷贝高效、防剥离发生的方法:

使容器包含指针而不是对象。(ps:STL容器是在创建拷贝,相比数组,是动态创建,节省时间和空间)

2. 总是调用empty()而不是size==0来判断容器是否为空:

empty()对所有STL容器都是常数时间操作,而size()对某些容器(如list)是线性时间操作,size()更耗时。

3. vector、list、deque的比较:

(1)vector是连续存储结构,相比数组,多了动态内存管理。

优点是:支持高效的随机访问,支持尾端高效插入/删除。占用内存小。

缺点是:首端和中间位置的插入/删除效率低下。

(ps:vector扩充内存的步骤:①分配一块更大的新内存 ②将原内存中数据复制到新内存 ③将原内存空间释放给系统)

(2)duque是连续存储结构,相比vector,deque维护了容器的首端地址,故支持高效的首端插入/删除操作。

优点是:支持高效的随机访问,支持首尾端高效插入/删除。

缺点是:占用的内存大。

(3)list是非连续存储结构,是双向链表结构,每个节点维护其前后节点的地址,故支持前/后向遍历。

优点是:不使用连续内存完成动态操作,支持任意位置高效的随机插入/删除。

缺点是:不能进行内部随机访问(不支持[]和.at()),占用的内存大。

(4)三者使用原则:

① 如果需要高效的随机存取,而不在乎插入/删除的效率,使用vector

② 如果需要大量高效的插入/删除,而不在乎随机存取时间,使用list

③ 如果需要高效的随机存取,还要大量的首尾端插入/删除,使用deque

4. 区间成员函数要优于对应的单元素成员函数:

区间成员函数,即:insert(iterator begin, iterator end)、erase(iterator begin, iterator end)、assign(iterator begin, iterator end)

单元素成员函数,即:push_back(元素)、push(元素)、insert(元素)、erase(元素)

使用区间成员函数的好处:代码简洁、容易表达意图、效率高。

5. 容器中的元素类型是new出来指针类型,要注意:

需要记得容器使用完后,人工delete指针指向内存。或者用带有引用计数的智能指针shared_ptr作为容器元素,可以不用人工释放内存,避免内存泄露。(ps:切记不能使用auto_ptr,其不是引用计数的智能指针)