最近准备把stl好好看看,对数据结构和算法加深理解,选择的是侯捷的《STL源码剖析》。
先把一些思路片段纪录下来,回头整理。
1. front(), back() 和 pop_back() 函数不是很安全,
#include<vector> #include<iostream> using namespace std; int main() { vector<int> ivec; cout << "size =" << ivec.size() << endl; cout << "capacity = " << ivec.capacity() << endl; ivec.pop_back(); cout << "after pop_back: " << endl; cout << "size =" << ivec.size() << endl; cout << "capacity = " << ivec.capacity() << endl; cout << "test" << endl; cout << "front = " << ivec.front() << endl; cout << "back() = " << ivec.back() << endl; return 0; }
<span style="font-family: Arial, Helvetica, sans-serif;">上面</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">的代码例子会导致,内存泄漏。输出结果为:</span>
size =0
capacity = 0
size =18446744073709551615 //pop_back导致finish指针越界
capacity = 0
test
段错误 (core dumped) //front,back 内存错误
2. vector 是个顺序的序列,跟array很像,但是vector 实现l了对用户来说,空间操作是无限的概念,不用管先要申请一片空间,再在插入数据过程中空间够不够,需不需要再申请,偶外的空间还需要数据移动。
这些vector 都给你做好了,只需要push_back, 和insert就可以了。
3. 使用vector性能分析
在使用vector插入数据的时候,发现性能不是很好,来看下push_back的代码:
void push_back(const T& x){ if (finish != end_of_storage){ construct(finish, x); ++ finish; } else insert_aux(end(), x); }
push_back的时候都会调用construct函数,拷贝构造函数的性能一般都不是很好,因为他需要复制一个结构体。这个时候可以考虑使用一个指针,这样 construct的时候,只需要复制指针就可以了。
但是这个有个麻烦就是,需要你自己释放这个指针所对应的对象。
4. vector的空间默认是两倍于当前空间的申请
这样设计也是为了性能考虑,频繁的申请空间和移动元素很耗性能。