C++数据结构之Vector向量容器

vector

1.1 vector 说明

  • vector是向量类型,可以容纳许多类型的数据,因此也被称为容器

  • (可以理解为动态数组,是封装好了的类)

  • 进行vector操作前应添加头文件#include <vector>

1.2 vector初始化

 1 方式一
 2 //定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定
 3 vector<int>a(10);
 4 
 5 方式二
 6 //定义具有10个整型元素的向量,且给出的每个元素初值为1
 7 vector<int>a(10,1);
 8 
 9 方式三
10 //用向量b给向量a赋值,a的值完全等价于b的值
11 vector<int>a(b);
12 
13 方式四
14 //将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型
15 vector<int>vec1{ 1,2,3,4,5,6,7 };
16 vector<int>vec(vec1.begin(), vec1.begin() + 3);
17 
18 方式五
19 //从数组中获得初值
20 int b[7]={1,2,3,4,5,6,7};
21 vector<int> a(b,b+7);

 

vector常用的函数

 

  1 #include<iostream>
  2 #include<vector>
  3 using namespace std;
  4 template <typename T>
  5 ostream& operator<<(ostream& os, const vector<T>vec)
  6 {
  7     for (auto e : vec)
  8     {
  9         os << e << ' ';
 10     }
 11     os << endl;
 12     return os;
 13 }
 14 
 15 //循环输入插入值
 16 void text1()
 17 {
 18     vector<int> vec;
 19     for (int i = 0; i < 10; i++)
 20     {
 21         int num;
 22         cin >> num;
 23         vec.push_back(num);
 24     }
 25     cout << vec;
 26 }
 27 
 28 //初始化值
 29 vector<int> text2()
 30 {
 31     vector<int>vec(10, 2);
 32     return vec;
 33 }
 34 
 35 //用向量b给向量a赋值
 36 void text3()
 37 {
 38     vector<int>vec(text2());
 39     cout << vec;
 40 }
 41 
 42 //切块赋值
 43 void text4()
 44 {
 45     vector<int>vec1{ 1,2,3,4,5,6,7 };
 46     vector<int>vec(vec1.begin(), vec1.begin() + 4);
 47     cout << vec;
 48 }
 49 
 50 //从数组中获取初值(兼容C语言)
 51 void text5()
 52 {
 53     int a[] = { 1,2,3,4,5,6,7,8,9,10 };
 54     vector<int>vec(a, a + 7);
 55     cout << vec;
 56 }
 57 
 58 //vector对象的常用内置函数使用
 59 
 60 //assgin(重新分配内存空间)
 61 void text6()
 62 {
 63     vector<int>vec1{ 1,2,3,4,5 };
 64     vector<int>vec2{ 6,7,8,9,10};
 65     vec1.assign(vec1.begin(), vec1.begin()+3);
 66     cout << vec1;
 67 }
 68 
 69 //back(返回最后一个元素)
 70 void text7()
 71 {
 72     vector<int>vec{ 1,2,3,4,5,6 };
 73     cout<<vec.back();
 74 }
 75 
 76 //front(返回第一个元素)
 77 void text8()
 78 {
 79     vector<int>vec{ 1,2,3,4,5,6 };
 80     cout << vec.front();
 81 }
 82 
 83 //clear(清空元素)
 84 void text9()
 85 {
 86     vector<int>vec{ 1,2,3,4,5,6 };
 87     vec.clear();
 88     cout << vec;
 89 }
 90 
 91 //empty(判断a是否为空,空则返回true,非空则返回false)
 92 void text10()
 93 {
 94     vector<int>vec{ 1,2,3,4,5,6 };
 95     auto x=vec.empty();
 96     cout << x;
 97 }
 98 
 99 //pop_back(删除最后一个元素)
100 //push_back(在最后追加元素)
101 void text11()
102 {
103     vector<int>vec{ 1,2,3,4,5,6,7,8,9,10 };
104     vec.pop_back();
105     cout << vec;
106     int a = 10;
107     vec.push_back(a);
108     cout << vec;
109 }
110 
111 //erase(指定位置删除)
112 //insert(指定位置插入)
113 void text12()
114 {
115     vector<int>vec={ 1,2,3,4,5,6,7,8,9,10 };
116     //删除一块连续的数据
117     vec.erase(vec.begin(), vec.begin() + 4);
118     cout << vec;
119     //删除指定位置的数据
120     vec.erase(vec.begin() + 4);
121     cout<<vec;
122     //在a的第一个元素(从第0个算起)位置插入3个数,其值为5,
123     vec.insert(vec.begin() + 1,3,5);
124     //指定位置插值
125     vec.insert(vec.begin() + 1, 999);
126     cout<<vec;
127 }
128 
129 //size(返回a中元素的个数)
130 void text13()
131 {
132     vector<int>vec = { 1,2,3,4,5,6,7,8,9,10,11 };
133     cout << vec.size()<<endl;
134 }
135 
136 //capacity(返回a在内存中总共可以容纳的元素个数)
137 void text14()
138 {
139     vector<int>vec = { 1,2,3,4,5,6,7,8,9,10,11 };
140     vec.pop_back();
141     vec.pop_back();
142     vec.pop_back();
143     int a = 990;
144     cout << vec;
145     vec.push_back(a);
146     cout << vec;
147     cout << vec.capacity();
148 
149 }
150 
151 //resize(将a的现有元素个数调整至10个,多则删,少则补)
152 void text15()
153 {
154     vector<int>vec = { 1,2,3,4,5,6,7,8,9,10};
155     vec.resize(15);
156     cout << vec;
157     //将a的现有元素个数调整至10个,多则删,少则补,其值为2
158     vec.resize(25, 2);
159     cout << vec;
160 }
161 
162 //reserver(扩容,只增不减)
163 void text16()
164 {
165     vector<int>vec = { 1,2,3,4,5,6,7,8,9,10 }; 
166     vec.reserve(100);
167     cout<<vec.capacity()<<endl;
168 }
169 
170 //swap(整体交换)
171 void text17()
172 {
173     vector<int>vec1{ 1,2,3,4,5 };
174     vector<int>vec2{ 6,7,8,9,10 };
175     vec1.swap(vec2);
176     cout << vec1;
177     cout << vec2;
178 }
179 
180 int main()
181 {
182     text17();
183 }

vector兼容C语言

 

 1 //vector的特性非常强大了,但是,我们很多情况要使用c语言的数组,可能旧的函数和接口需要调用C语言的数组函数
 2 //data() 函数,返回C语言的指针
 3 //通过data函数返回C语言指针 
 4 vector<int> vec(10); 
 5 int *p=vec.data(); 
 6 //通过首地址和尾地址,进行拷贝原来的数组 
 7 int arr[10] = { 98, 21, 654, 78, 6, 54, 21, 32, 65, 12 }; 
 8 vector<int> vec2(arr,arr+10);
 9 
10 //使用二维vector数组
11 //二维的vector可以直接用嵌套的方式来进行创建,就是模板中套用 vector 模板
12 //创建一个二维的vector,二维的vector可以每个vector长度不一样 
13 vector<vector<int>> v2; 
14 //使用匿名构造插入一个vector 
15 v2.push_back(vector<int>(10)); 
16 v2.push_back(vector<int>(5));
17 
18 //访问二维数组元素
19 v2[1][3]=32;
20 
21 //遍历二维数组的所有元素
22 for (vector<int>& e2 : v2) 
23 { 
24     //e2是一个vector<int> 加引用可以防止数组被直接拷贝
25      for (int e : e2) 
26         { 
27             cout << e << " ";
28          }    
29         cout << endl;
30  } 
31     

 

 
 
posted @ 2021-03-17 23:22  Yesir01  阅读(329)  评论(0)    收藏  举报