一、vector类
vecotr是可以改变大小的数组的序列容器,其特点有:
(1)vector采用连续空间来存储元素,可以使用下标访问vector元素,访问元素和数组一样方便。vector大小可以动态改变,而且会被容器自动处理,这一点数组无法做到。
(2)vector使用动态分配分配数组来存储元素,插入新元素时,vector数组为了增加存储空间,会分配一个新数组,再把所有元素全部移动到这个数组里,代价相对高一些。
(3)vector会分配额外的空间来满足可能的增长,因为分配的存储空间比实际需要的的存储空间更大。vector以动态增长的方式管理存储空间。
(4)vector在访问元素、末尾添加删除元素时很高效,在其他位置插入删除需要挪动元素,效率低。
二、vector类成员
1. //构造空的vector 2. explicit vector (const allocator_type& alloc = allocator_type()); 3. 4. //构造一个vector,有n个元素,每个元素值为val 5. explicit vector (size_type n, const value_type& val = value_type(), 6. const allocator_type& alloc = allocator_type()); 7. 8. //构造一个vector,值为InputIterator的first到last之间的元素 9. template <class InputIterator> 10. vector (InputIterator first, InputIterator last, 11. const allocator_type& alloc = allocator_type()); 12. 13. //使用x拷贝构造一个vector 14. vector (const vector& x);
1. #include<iostream> 2. #include<vector> 3. 4. using namespace std; 5. int main() 6. { 7. vector<int> v;//构造一个没有元素的空容器 8. vector<int> v1(3, 5);//构造一个有3个元素的容器,每个元素的值都为5 9. vector<int> v2(v1.begin(),v1.end());//构造一个从v1.begin()到v1.end()顺序及相同值的容器 10. vector<int> v3(v2);//以与v2相同的顺序及值拷贝构造一个容器 11. 12. //插入4个元素 13. v.push_back(1); 14. v.push_back(2); 15. v.push_back(3); 16. v.push_back(4); 17. 18. return 0; 19. }
1. reference operator[] (size_type n); //可读可写 2. const_reference operator[] (size_type n) const;//只读
vector使用operator[ ]遍历元素,像数组一样:
1. for (size_t i = 0; i < v.size(); i++) 2. { 3. cout << v[i] << " "; 4. } 5. cout << endl;
迭代器是一种容器可以统一使用的遍历方式,因此vector也支持使用迭代器遍历
1. iterator begin(); //可读可写 2. const_iterator begin() const;//只读 3. 4. iterator end(); //可读可写 5. const_iterator end() const; //只读 6. 7. reverse_iterator rbegin(); //反向迭代器 可读可写 8. const_reverse_iterator rbegin() const; //反向迭代器 只读 9. 10. reverse_iterator rbegin(); //反向迭代器 可读可写 11. const_reverse_iterator rbegin() const; //反向迭代器 只读
(1)迭代器
①可读可写
1. vector<int>::iterator it = v.begin();//可读可写 2. while (it != v.end()) 3. { 4. *it += 2; 5. cout << *it << " "; 6. it++; 7. } 8. cout << endl;
②只读
1. vector<int>::const_iterator it = v.begin();//只读 2. while (it != v.end()) 3. { 4. cout << *it << " "; 5. it++; 6. } 7. cout << endl;
(2)反向迭代器 (这段代码屏蔽了(1)的迭代器)
①可读可写
1. vector<int>::reverse_iterator rit = v.rbegin();//可读可写 2. while (rit != v.rend()) 3. { 4. *rit += 2; 5. cout << *rit << " "; 6. rit++; 7. } 8. cout << endl;
②只读
1. vector<int>::const_reverse_iterator rit = v.rbegin();//只读 2. while (rit != v.rend()) 3. { 4. cout << *rit << " "; 5. rit++; 6. } 7. cout << endl;
前面的PrintVector( )只能打印元素为int的vector,如果vector元素类型不是int,而是char或float类型,该如何打印呢?使用模板可以实现,有关模板的详细说明请阅读文章【C++】-- 模板详解
1. //打印 2. template<class T>//类模板定义 3. void PrintVector(const vector<T>& v) 4. { 5. //指定参数类型 6. vector<T>::const_iterator it = v.begin();//只读 7. while (it != v.end()) 8. { 9. cout << *it << " "; 10. it++; 11. } 12. cout << endl; 13. }
1. int main() 2. { 3. vector<int> v;//定义一个vector,该vector里面的元素都是int型的 4. //插入4个int元素 5. v.push_back(1); 6. v.push_back(2); 7. v.push_back(3); 8. v.push_back(4); 9. PrintVector(v); 10. 11. string s1 = "Hello world"; 12. vector<char> v4(s1.begin(), s1.end()); 13. PrintVector(v4); 14. 15. vector<double> v5; 16. 插入4个float元素 17. v5.push_back(1.1); 18. v5.push_back(2.2); 19. v5.push_back(3.3); 20. v5.push_back(4.4); 21. PrintVector(v5); 22. 23. return 0; 24. }
注:如果编译报vector<T>::const_iterator it = v.begin();代码有如下错误:
调试-解决方案调试属性-语言-符合模式-否就可以编译通过了
5.vector拷贝构造
1. vector<string> v6; 2. v6.push_back(string("delia")); 3. 4. vector<string> v7(v6);//用v6拷贝构造v7 5. PrintVector(v7); 6. 7. vector<double> v8(v5);//用v5拷贝构造v8 8. PrintVector(v8);