vector容器

vector容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
//
// Created by Jason on 2020/3/29.
//
/*
*
3.2.4.1 vector构造函数
vector<T>v;//釆用模板实现类实现,默认构造函数+
vector(v. begin(),v.end())://将 vector(v. begin(),v.end())区间中的元素拷贝给本身。
vector(n,elem)://构造函数将n个elem 拷贝给本身。
vector( const vector&vec)://拷贝构造函数。
//例子使用第二个构造函数我们可以
int arr[]={2,3,4,1,9};
vector<int >v1(arr, arr+sizeof(arr)/ sizeof(int));
3.2.4.2 vector常用赋值操作
assign(beg,end):/将[beg,end)区间中的数据拷贝赋值给本身。
assign(n,elem)://将n个elem拷贝赋值给本身。
vector& operator=( const vector&vec)://重载等号操作符
swap(vec)://将vec与本身的元素互换。
3.2.4.3 vector大小操作
size() //返回客器中元素的个数
empty()//判断器是否为空
resize( int num)://重新指定窨器的长度为num,若寳器变长,则以默认值填充新位置。如果窨器变
则末尾超出容器长度的元素被刪除。
resize( int num,elem)://重新指定窨器的长度为num,若寳器变长,唢以e值填充新位置。如
果窨器变短,则末尾超出窨器长度的元素被刪除。
capacity()://睿器的窖量
reserve( int len);//窖器预留1mn个元素长度,预留位置不初始化,元素不可访问。
3.2.4.4 vector数据存取操作
at( int idx)://返回索引id所指的数据,如果iκ越畀,抛岀ourt_ of range异常。艹
operator[]://返回索引id所指的数据,越畀时,运行直接报错
front()//返回窨器中第一个数据元素
back()//返回窨器中最后一个数据元素
3.2.4.5 vector插入和删除操作
insert( const_ iterator pos, int count,elem)://迭代器指向位置pos插入cmt个元素elem.
push back(elem)://尾部插入元素e1em
pop_ back()//刪除最后一个元素
erase( const_iterator start, const_ iterator end)://刪除迭代器从 start到end之间的元素
erase( const_iterator pos)://刪除迭代器指向的元素
clear()://刪除窖器中所有元素

拓展
sort 函数,可以加上greater<Elem>来解决降序
* */
#include<bits/stdc++.h>
using namespace std;
void test01() {
vector<int> v;
for (int i = 0; i < 160; i++)
{
v.push_back(i);
cout<<v.capacity()<<endl;
}
}
void printVector(vector<int>&v)
{
for(vector<int>::iterator it = v.begin();it!=v.end(); it++)
{
cout<<*it<<endl;
}
}
void test02()
{
vector<int>v1;
vector<int>v2(10,100);
// printVector(v2);
vector<int>v3(v2.begin(),v2.end());
// printVector(v3);
vector<int>v4;
// v4.assign(v3.begin(),v3.end());
v4 = v3;//这两种方法都可以
printVector(v4);
int arr[]={2,3,4,1,9};
vector<int >v5(arr, arr+sizeof(arr) / sizeof(int));
//swap来交换
v4.swap(v5) ;//4与5交换了
printVector(v4);
}
void test03()
{
vector<int>v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
cout<<"size = "<<v1.size()<<endl;
if(v1.empty())//如果为空,返回值为1,不为空,返回值为0;
{
cout<<"V1 is empty"<<endl;
}else cout<<"v1 is not empty"<<endl;
v1.resize(10);//不足10,默认0填充
// printVector(v1);
v1.resize(10,1000);//可以指定,默认为1000填充
// printVector(v1);
v1.resize(3);//变短了,末尾超出容器的部分被删掉
// printVector(v1);
v1.resize(4);//被删除后,恢复原来的长度,删除的数据不回复原
printVector(v1);
cout<<"The first elem of v1 is "<<v1.front()<<endl;
cout<<"The last elem of v1 is "<<v1.back()<<endl;
/************************************************************/
v1.insert(v1.begin(),1000);//插一个数
v1.insert(v1.begin(),2,2000);//插自定义
//1000 10 20 30 0
printVector(v1);

v1.push_back(999);
printVector(v1);
v1.pop_back();
printVector(v1);

//删除
v1.erase(v1.begin() );//头部删除
printVector(v1);
v1.erase(v1.begin(),v1.end());//全部删除
printVector(v1);
v1.push_back(1);
printVector(v1);
v1.clear();//清空 =v1.erase(v1.begin(),v1.end());
printVector(v1);
}
/*************************************************************************/
//案例,巧用swap 收缩内存
void test04()
{
vector<int>v;
for(int i = 0;i<100000;i++)
{
v.push_back(i);
}
cout<<"v的容量"<<v.capacity()<<endl;
cout<<"v的大小"<<v.size()<<endl;
v.resize(3);
cout<<"resize(3)以后"<<endl;
cout<<"v的容量"<<v.capacity()<<endl;
cout<<"v的大小"<<v.size()<<endl;
vector<int>(v).swap(v);
cout<<"swap(v)以后,会收缩内存"<<endl;
cout<<"v的容量"<<v.capacity()<<endl;
cout<<"v的大小"<<v.size()<<endl;
}
/****************************************************************************/
void test05()
{
// 用reserve预留空间!
vector<int>v;
int num = 0;
int *p = NULL;
for(int i =0;i<100000;i++)
{
v.push_back(i);
//当容量不够的时候,vector容器会找到新的空间,这时候p就不指向头部了
if(p!= &v[0])
{
p = &v[0];
num++;
}
}
cout<<"NUM ="<<num<<endl;
}
void test06()
{
vector<int>v;
int num = 0;
int *p = NULL;
v.reserve(10000000);
for(int i =0;i<100000;i++)
{
v.push_back(i);
//当容量预留后,p就没动过
if(p!= &v[0])
{
p = &v[0];
num++;
}
}
cout<<"NUM ="<<num<<endl;
}
/***************************************************************/
//逆序遍历
void test07()
{
vector<int>v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
cout<<"正序遍历"<<endl;
printVector(v1);

cout<<"逆序遍历"<<endl;
for(vector<int>::reverse_iterator it = v1.rbegin();it!=v1.rend();it++)
{
cout<<*it<<endl;
}
//vector 容器的迭代器,随机访问迭代器
//如何让判断一个容器的迭代器是否支持随机访问
vector<int>::iterator itBegin = v1.begin();
itBegin = itBegin+1;
itBegin++;
itBegin--;

list<int>l;
l.push_back(10);
l .push_back(20);
l.push_back(30);
list<int>::iterator it2 = l.begin();
it2 ++;
it2 --;
// it = it+1; 会报错!!!
// list 容器不支持随机访问

}
/********************************************************************/
int main()
{
// test01();
// test02();
// test03();
// test04();
// test05();
// test06();
test07();
system("pause");
return 0;
}
-------------本文结束,感谢您的阅读-------------