在之前我们学习了string的使用与模拟实现,在参考文档中可以发现,vector和string以及其他的容器的接口基本都相同,所以这里也就简要的介绍一下。
同样的,在这里还是要说一下,对于STL库的学习,不可能在一朝一夕之间学完,要学会去查看文档和多练习vector参考文档
1. 主要结构
vector没有像string一样进行类型重定义typedef basic_string<char> string
,所以在使用vector的时候要指定模板参数类型例如vector<int>
。
2. 构造函数与复制重载
可以看到vector的构造函数实现相较于string就简化了很多,一共分为四个,分别是默认构造,指定长度和值的构造,迭代器区间构造,拷贝构造
void Test_Construct() { vector<int> v1;//默认构造 vector<int> v2(10, 3);//指定长度和值的构造 string s("aaaaaaaaaaaaaa"); vector<char> v3(s.begin(), s.end());//迭代器区间构造 vector<char> v4(v3);//拷贝构造 }
通过监视查看四个对象的值如上。
3. 迭代器
由于vector也是通过动态数组实现的,所以原生指针就能很好的支持迭代器行为,所以在vector中的迭代器本质也是指针。
可以看到和string一样,vector的迭代器也分为普通迭代器,反向迭代器,const迭代器,const反向迭代器。
对于迭代器和反向迭代器的工作方式如上图。
4. 容量相关
1.容量读取
1. size
返回一个size_t类型的vector中数据个数
2. capacity
返回一个size_t类型的vector的容量。
使用范例:
void Test_Capacity() { vector<int> v; v.reserve(10); for (size_t i = 0; i < 5; ++i) { v.push_back(i); } cout << "size:" << v.size() << endl; cout << "capacity:" << v.capacity() << endl; }
运行结果为:
2.容量修改
1. reserve
扩大vector的容量到n,如果原来vector的容量大于等于n,不做任何操作
void Test_Capacity2() { vector<int> v(5, 1); cout << "before reserve capacity:" << v.capacity() << endl; v.reserve(10); cout << "after reserve capacity:" << v.capacity() << endl; }
2. resize
修改vector中的数据个数,如果n小于size,那就修改size;如果n大于size但是小于capacity,那就尾插数据直到size==n,如果n大于capacity,那就先扩容到n,再填充数据。
void Test_Capacity3() { vector<int> v(5, 1); cout << "before resize capacity:" << v.size() << endl; v.resize(10); cout << "after resize capacity:" << v.size() << endl; for (auto e : v) { cout << e << " "; } cout << endl; }