【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);

相关文章
|
1月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
68 5
|
30天前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
20 1
|
1月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
52 1
|
1月前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
1月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
22 0
|
1月前
|
算法 C++ 容器
C++之打造my vector篇(下)
C++之打造my vector篇(下)
26 0
|
1月前
|
存储 编译器 C++
C++之打造my vector篇(上)
C++之打造my vector篇(上)
25 0
|
1月前
|
算法 C++ 容器
【C++】—— vector使用
【C++】—— vector使用
|
1月前
|
存储 缓存 C++
C++番外篇——list与vector的比较
C++番外篇——list与vector的比较
21 0