最近在阅读MyTinySTL源码,没有往深入里面研究,主要看各种容器的用法和区别,以此加深对各容器的熟悉程度。在博客上主要也是记录部分代码和运行效果,作为笔记日后可复习。
下面是C语言中文网对于vector的描述,这里只摘取其中一段。具体的内容请看链接http://c.biancheng.net/view/348.html
vector 是顺序容器的一种。vector 是可变长的动态数组,支持随机访问迭代器,所有 STL 算法都能对 vector 进行操作。要使用 vector,需要包含头文件 vector。
在 vector 容器中,根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多数情况下也是常数,总体来说速度很快。
在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比。
在 vector 容器中,用一个动态分配的数组来存放元素,因此根据下标访问某个元素的时间是固定的,与元素个数无关。
vector 容器在实现时,动态分配的存储空间一般都大于存放元素所需的空间。例如,哪怕容器中只有一个元素,也会分配 32 个元素的存储空间。这样做的好处是,在尾部添加一个新元素时不必重新分配空间,直接将新元素写入适当位置即可。在这种情况下,添加新元素的时间也是常数。
但是,如果不断添加新元素,多出来的空间就会用完,此时再添加新元素,就不得不重新分配内存空间,把原有内容复制过去后再添加新的元素。碰到这种情况,添加新元素所花的时间就不是常数,而是和数组中的元素个数成正比。
至于在中间插入或删除元素,必然涉及元素的移动,因此时间不是固定的,而是和元素个数有关。
vector 有很多成员函数,常用的如表 1 所示。
成员函数 | 作 用 |
---|---|
vector() | 无参构造函数,将容器初始化为空 |
vector(int n) | 将容器初始化为有 n 个元素 |
vector(int n, const T & val) | 假定元素的类型是 T,此构造函数将容器初始化为有 n 个元素,每 个元素的值都是 val |
vector(iterator first, iterator last) | first 和 last 可以是其他容器的迭代器。一般来说,本构造函数初始化的结果就是将 vector 容器的内容变成与其他容器上的区间 [first, last) —致 |
void clear() | 删除所有元素 |
bool empty() | 判断容器是否为空 |
void pop_back() | 删除容器末尾的元素 |
void push_back( const T & val) | 将 val 添加到容器末尾 |
int size() | 返回容器中元素的个数 |
T & front() | 返回容器中第一个元素的引用 |
T & back() | 返回容器中最后一个元素的引用 |
iterator insert(iterator i, const T & val) | 将 val 插入迭代器 i 指向的位置,返回 i |
iterator insert( iterator i, iterator first, iterator last) | 将其他容器上的区间 [first, last) 中的元素插入迭代器 i 指向的位置 |
iterator erase(iterator i) | 删除迭代器 i 指向的元素,返回值是被删元素后面的元素的迭代器 |
iterator erase(iterator first, iterator last) | 删除容器中的区间 [first, last) |
void swap( vector <T> & v) | 将容器自身的内容和另一个同类型的容器 v 互换 |
以下是vector类测试部分代码,主要是vector对象的定义
std::cout << "[===============================================================]\n";
std::cout << "[----------------- Run container test : vector -----------------]\n";
std::cout << "[-------------------------- API test ---------------------------]\n";
int a[] = { 1,2,3,4,5 };
mystl::vector<int> v1;
mystl::vector<int> v2(10);
mystl::vector<int> v3(10, 1);
mystl::vector<int> v4(a, a + 5);
mystl::vector<int> v5(v2);
mystl::vector<int> v6(std::move(v2));
mystl::vector<int> v7{ 1,2,3,4,5,6,7,8,9 };
mystl::vector<int> v8, v9, v10;
v8 = v3;
v9 = std::move(v3);
v10 = { 1,2,3,4,5,6,7,8,9 };
这是运行后的效果
[===============================================================]
[----------------- Run container test : vector -----------------]
[-------------------------- API test ---------------------------]
After v1.assign(8, 8) : //vector v1调用函数assign 以下同理
v1 : 8 8 8 8 8 8 8 8 //vector v1调用函数assign后效果 以下同理
After v1.assign(a, a + 5) :
v1 : 1 2 3 4 5
After v1.emplace(v1.begin(), 0) :
v1 : 0 1 2 3 4
After v1.emplace_back(6) :
v1 : 0 1 2 3 4 6
After v1.push_back(6) :
v1 : 0 1 2 3 4 6 6
After v1.insert(v1.end(), 7) :
v1 : 0 1 2 3 4 6 6 7
After v1.insert(v1.begin() + 3, 2, 3) :
v1 : 0 1 2 3 3 3 4 6 6 7
After v1.insert(v1.begin(), a, a + 5) :
v1 : 1 2 3 4 5 0 1 2 3 3 3 4 6 6 7
After v1.pop_back() :
v1 : 1 2 3 4 5 0 1 2 3 3 3 4 6 6
After v1.erase(v1.begin()) :
v1 : 2 3 4 5 0 1 2 3 3 3 4 6 6
After v1.erase(v1.begin(), v1.begin() + 2) :
v1 : 4 5 0 1 2 3 3 3 4 6 6
After v1.reverse() :
v1 : 6 6 4 3 3 3 2 1 0 5 4
After v1.swap(v4) :
v1 : 1 2 3 4 5
*v1.begin() : 1
*(v1.end() - 1) : 5
*v1.rbegin() : 5
*(v1.rend() - 1) : 1
v1.front() : 1
v1.back() : 5
v1[0] : 1
v1.at(1) : 2
After change v1.data() :
v1 : 10 20 30 4 5
v1.empty() : false
v1.size() : 5
v1.max_size() : 4611686018427387903
v1.capacity() : 16
After v1.resize(10) :
v1 : 10 20 30 4 5 0 0 0 0 0
v1.size() : 10
v1.capacity() : 16
After v1.shrink_to_fit() :
v1 : 10 20 30 4 5 0 0 0 0 0
v1.size() : 10
v1.capacity() : 10
After v1.resize(6, 6) :
v1 : 10 20 30 4 5 0
v1.size() : 6
v1.capacity() : 10
After v1.shrink_to_fit() :
v1 : 10 20 30 4 5 0
v1.size() : 6
v1.capacity() : 6
After v1.clear() :
v1 :
v1.size() : 0
v1.capacity() : 6
After v1.reserve(5) :
v1 :
v1.size() : 0
v1.capacity() : 6
After v1.reserve(20) :
v1 :
v1.size() : 0
v1.capacity() : 20
After v1.shrink_to_fit() :
v1 :
v1.size() : 0
v1.capacity() : 0
[ PASSED ]
[--------------------- Performance Testing ---------------------]
|---------------------|-------------|-------------|-------------|
| push_back | 500000 | 5000000 | 50000000 |
| std | 7ms | 85ms | 1171ms |
| mystl | 14ms | 106ms | 1177ms |
|---------------------|-------------|-------------|-------------|
[ PASSED ]
[----------------- End container test : vector -----------------]