vector
vector是表示可变大小数组的序列容器,就像数组一样,采用连续存储空间来存储元素,功能和数组类似,但是vector可以管理动态内存,并且在vector中的元素可以是自定义类型。
arr与str中已经存放进了我们初始化的数据。
常用接口介绍
这里很多都和string的接口相似,就不一一介绍了
初始化
vector (const allocator_type& alloc = allocator_type());//无参构造函数
参数:是库里面写的空间配置器组件
vector (size_type n, const value_type& val = value_type(),const allocator_type& alloc = allocator_type());//构造并且初始化n个val
参数:第一个是数据数量,第二个是数据本身,第三个是空间配置器组件
template <class InputIterator>
vector (InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());//使用迭代器进行初始化构造
参数:第一个是头第二个是尾,第三个是空间配置器组件
vector (const vector& x);//拷贝构造
#include <iostream> #include <vector> using namespace std; int main() { vector<int>arr; for (int i = 0; i < arr.size(); i++) { cout << arr[i]; } cout << endl; vector<int>arr1 = { 1,2 }; for (int i = 0; i < arr1.size(); i++) { cout << arr1[i]; } cout << endl; vector<int>arr2(5, 2); for (int i = 0; i < arr2.size(); i++) { cout << arr2[i]; } cout << endl; vector<int>arr3(arr1); for (int i = 0; i < arr3.size(); i++) { cout << arr3[i]; } cout << endl; arr.push_back(1); arr.push_back(2); arr.push_back(3); arr.push_back(4); vector<int>arr4(arr.begin(), arr.end()); for (auto e : arr4) { cout << e; } cout << endl; return 0; }
reserve与resize
的
这个和string的类似,都是先开辟一处指定空间大小,但是不会缩容:
#include <iostream> #include <vector> using namespace std; int main() { vector<int>arr; arr.push_back(1); arr.push_back(2); arr.push_back(3); arr.push_back(4); cout << arr.capacity() << endl; arr.reserve(10);//size并不会变大 cout << arr.capacity() << endl; arr.reserve(3); cout << arr.capacity() << endl;//不缩容 return 0; }
这里要注意一下,val这个参数是一个模板,缺省值是一个匿名的模板的对象,因为传过来的不一定就是内置类型,很有可能是自定义类型。
#include <iostream> #include <vector> using namespace std; int main() { vector<int>arr; arr.push_back(1); arr.push_back(2); arr.push_back(3); arr.push_back(4); arr.push_back(5); arr.resize(8);//空位补0 for (auto e : arr) { cout << e; } cout << endl << arr.capacity() << endl; arr.resize(15, 1);//空位补1 for (auto e : arr) { cout << e; } cout << endl << arr.capacity() << endl; arr.resize(3);//减小长度但不缩容 for (auto e : arr) { cout << e; } cout << endl << arr.capacity() << endl; return 0; }
assign
#include <iostream> #include <vector> using namespace std; int main() { vector<int>arr; arr.push_back(1); arr.push_back(2); arr.push_back(3); for (auto e : arr) { cout << e << ' '; } cout << endl; arr.assign(10, 1); for (auto e : arr) { cout << e << ' '; } cout << endl; vector<int>arr1; arr1.push_back(4); arr1.push_back(5); arr1.push_back(6); arr1.push_back(7); arr.assign(arr1.begin(), arr1.end()); for (auto e : arr) { cout << e << ' '; } cout << endl; string str("hello world"); arr.assign(str.begin(), str.end()); for (auto e : arr) { cout << e << ' '; } cout << endl; return 0; }
缩容接口
最好不要缩容,因为vector设计理念就是不动空间,空间换时间,代价很大。
和原来一样,需要开辟一块新空间,然后释放掉原来的空间,再进行拷贝,此函数是为了节省空间。
#include <iostream> #include <vector> using namespace std; int main() { vector<int>arr; arr.push_back(0); arr.push_back(0); arr.push_back(0); arr.reserve(10); cout << arr.capacity() << endl; arr.shrink_to_fit(); cout << arr.capacity() << endl; return 0; }