1.vector的介绍及使用
1.1 vector的使用
vector学习时一定要学会查看文档:vector的文档介绍,vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。
1.1.1 vector的定义
(constructor)构造函数声明 | 接口说明 |
vector()(重点) | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
vector (const vector& x); (重点) | 拷贝构造 |
vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 |
1.1.2 vector iterator 的使用
iterator的使用 | 接口说明 |
begin + end(重点) | 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator |
rbegin + rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator |
1.1.3 vector 空间增长问题
容量空间 | 接口说明 |
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空 |
resize(重点) | 改变vector的size |
reserve (重点) | 改变vector的capacity |
capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
resize在开空间的同时还会进行初始化,影响size。
reserve 跟 resize 的区别:
int main()
{
//reserve:
vector<int> v1{ 1,2,3,4,5 };
v1.reserve(20);
cout << v1.size() << endl; //5
cout << v1.capacity() << endl; //20
v1.reserve(2);
cout << v1.size() << endl; //5 不会被缩小,最多到能存放数据的个数大小
cout << v1.capacity() << endl; //20 已经被开辟好的内存大小就已经确定下来,不会缩小
//resize():
vector<int> v2{ 1,2,3,4,5 };
v2.resize(20,6);
for (int i = 0; i < v2.size(); i++)
{
cout << v2[i] << " ";
}
cout << endl;
cout << v2.size() << endl; //20 1 2 3 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
cout << v2.capacity() << endl; //20
v2.resize(3, 4);
for (int i = 0; i < v2.size(); i++)
{
cout << v2[i] << " ";
}
cout << endl;
cout << v2.size() << endl; //3 1 2 3
cout << v2.capacity() << endl; //20
//说明resize()会对原有数据进行删除,但是capacity却不会变小,原来开辟的空间大小不变,
//如果resize(20,6) 比原来空间要大,那么就会在后面空间补上全6,若没有第二个参数,就补上全0
//v2.size()会跟着resize()的变化而变化
//v1.size()不会跟着reserve变化,reserve只能开辟内存空间,capacity会跟着变大
return 0;
}
1.1.4 vector 增删查改
vector增删查改 | 接口说明 |