【C++】-- STL之vector详解(一)

简介: 【C++】-- STL之vector详解

一、vector类

vecotr是可以改变大小的数组的序列容器,其特点有:

(1)vector采用连续空间来存储元素,可以使用下标访问vector元素,访问元素和数组一样方便。vector大小可以动态改变,而且会被容器自动处理,这一点数组无法做到。

(2)vector使用动态分配分配数组来存储元素,插入新元素时,vector数组为了增加存储空间,会分配一个新数组,再把所有元素全部移动到这个数组里,代价相对高一些。

(3)vector会分配额外的空间来满足可能的增长,因为分配的存储空间比实际需要的的存储空间更大。vector以动态增长的方式管理存储空间。

(4)vector在访问元素、末尾添加删除元素时很高效,在其他位置插入删除需要挪动元素,效率低。


二、vector类成员

1.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. }

2.vector元素访问符

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;

3.vector迭代器

迭代器是一种容器可以统一使用的遍历方式,因此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;

4.vector模板

前面的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);

相关文章
|
11天前
|
存储 C++ 容器
C++STL(标准模板库)处理学习应用案例
【4月更文挑战第8天】使用C++ STL,通过`std:vector`存储整数数组 `{5, 3, 1, 4, 2}`,然后利用`std::sort`进行排序,输出排序后序列:`std:vector<int> numbers; numbers = {5, 3, 1, 4, 2}; std:sort(numbers.begin(), numbers.end()); for (int number : numbers) { std::cout << number << " "; }`
17 2
|
22天前
|
存储 C++ 容器
【C++】vector的底层剖析以及模拟实现
【C++】vector的底层剖析以及模拟实现
|
25天前
|
存储 算法 测试技术
C++:Vector的使用
C++:Vector的使用
|
7天前
|
存储 算法 C++
【C++初阶】STL详解(九) priority_queue的使用与模拟实现
【C++初阶】STL详解(九) priority_queue的使用与模拟实现
20 0
|
7天前
|
存储 算法 编译器
【C++初阶】STL详解(三)vector的介绍与使用
【C++初阶】STL详解(三)vector的介绍与使用
21 0
|
7天前
|
存储 编译器 C++
【C++初阶】STL详解(四)vector的模拟实现
【C++初阶】STL详解(四)vector的模拟实现
32 1
|
12天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
47 1
|
12天前
|
存储 编译器 C++
【C++初阶】10. vector的使用及模拟实现
【C++初阶】10. vector的使用及模拟实现
49 1
|
23天前
|
算法 C++ 容器
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
|
23天前
|
C++ 容器
【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现
【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现