没有输出的输入是不完整的

0%

vector的简单使用

本文为c++容器系列第一篇.
主要测试了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
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;

double getAverage(const vector<double> &arr){
double sum =0;
for (unsigned i=0;i<arr.size();i++){
sum += arr[i];
}
return sum/arr.size();
}

template <class T>
void printVector(const char * msg,T& s){
cout<<msg<<'\t';
for(auto a:s){
cout<<a<<'\t';
}
cout<<'\n';
}

int main(){
//vector 初始化的方式
vector<double> arr ={1,2,3,4,5,6};
vector<int> arr1(5,1);
vector<int> arr2{1,2,3,4,5};
auto arr3 = {1,2,3};
vector<int> arr4(arr2.begin(),arr2.begin()+2);
vector<int> arr5(5);

printVector("print initial content arr:",arr); //1 2 3 4 5 6
printVector("print initial content arr1:",arr1); // 1 1 1 1 1
printVector("print initial content arr2:",arr2); // 1 2 3 4 5
printVector("print initial content arr3:",arr3); // 1 2 3
printVector("print initial content arr4:",arr4); // 1 2
printVector("print initial content arr5:",arr5); // 0 0 0 0 0

//直接通过索引获取数据
cout<<"arr[2]: \t"<<arr[2]<<endl;
cout<<"arr.at(2) \t "<<arr.at(2)<<endl;
// 通过front获得头元素。通过back获得尾部元素
cout<<"arr.front() \t"<<arr.front()<<endl;
cout<<"arr.back() \t"<<arr.back()<<endl;


cout<<"arr.data()\t"<<*(arr.data()+1)<<endl;
// arr.data()返回值是一个指针,指向数组的第一个值
// arr.begin()返回值是一个iterator, 同样指向数组的第一个值。
cout<<"*data() == *begin() "<<(*arr.data()==*arr.begin())<<endl;
cout<<"arr.begin()\t"<<*arr.begin()<<endl;

// size()是获取当前vector的元素个数
cout<<"arr.size()\t"<<arr.size()<<endl;
// empty()是判断当前数组是否为空
cout<<"arr.empty()\t"<<arr.empty()<<endl;
// capacity() returns the number of elements
that can be held in currently allocated storage
cout<<"arr.capacity()\t"<<arr.capacity()<<endl;
// returns the maximum possible number of elements
cout<<"arr.max_size()\t"<<arr.max_size()<<endl;

// 清空整个数组
arr.clear();
printVector("arr.clear()", arr);

//insert 在对应位置前面添加一个元素,成为这个位置的元素
arr.insert(arr.begin(), 1);
printVector("insert begin \t", arr);
arr.insert(arr.begin(), 4);
printVector("insert begin", arr);
arr.insert(arr.end(),2);
printVector("insert end()\t",arr);

//emplace 在对应位置前面添加一个元素,功能类似于insert.
//两者的区别在于insert插入的是一个对象,一个已经构建好的对象
// 而emplace可以直接传入参数,这里隐含一个构造函数。
arr.emplace(arr.begin(), 3);
printVector("emplace begin()", arr);
arr.emplace(arr.begin()+1,5);
printVector("emplace begin+1", arr);

//erase:删除iteator所指向的元素。
arr.erase(arr.begin());
printVector("erase begin \t", arr);
arr.erase(arr.end()-1);
printVector("erase end-1",arr);

// arr.begin()返回指向vector第一个元素的指针
// arr.end()返回指向vector最后一个元素再后面一个元素的指针。
printVector("print arr ", arr);
cout<<"arr.begin() \t"<<*arr.begin()<<endl;
cout<<"arr.end()-1 \t"<<*(arr.end()-1)<<endl;
cout<<"arr.end() \t"<<*arr.end()<<endl;

// 通过iterator打印整个vector
cout<<"print the vector"<<endl;
// 下面两个构造方式等价,auto 是c++11的新特性。
//vector<double>::iterator a = arr.begin();
auto a = arr.begin();
while(a!=arr.end()){
cout<<*a<<'\t';
a++;
}

// vector 添加一个元素到末尾
arr.push_back(6);
printVector("push back 6: ", arr);

// vector 删除最后一个元素
arr.pop_back();
printVector("pop back 6: ", arr);

// 先打印原来的数据。
printVector("former vector", arr);

// 这个其实也是构造函数,得到arr树组的反序树组
vector<int> rarr(arr.rbegin(),arr.rend());
printVector("reverse arr", rarr);

// 可以直接通过stl中的reverse方式来将原来的vector进行逆序
reverse(arr.begin(),arr.end());
printVector("reverse former arr", arr);

// 调用前面的方法得到树组的平均数
cout<<"average of arr:"<<getAverage(arr)<<endl;
return 0;
}

/* 运行结果
print initial content arr: 1 2 3 4 5 6
print initial content arr1: 1 1 1 1 1
print initial content arr2: 1 2 3 4 5
print initial content arr3: 1 2 3
print initial content arr4: 1 2
print initial content arr5: 0 0 0 0 0
arr[2]: 3
arr.at(2) 3
arr.front() 1
arr.back() 6
arr.data() 2
*data() == *begin() 1
arr.begin() 1
arr.size() 6
arr.empty() 0
arr.capacity() 6
arr.max_size() 2305843009213693951
arr.clear()
insert begin 1
insert begin 4 1
insert end() 4 1 2
emplace begin() 3 4 1 2
emplace begin+1 3 5 4 1 2
erase begin 5 4 1 2
erase end-1 5 4 1
print arr 5 4 1
arr.begin() 5
arr.end()-1 1
arr.end() 2
print the vector
5 4 1 push back 6: 5 4 1 6
pop back 6: 5 4 1
former vector 5 4 1
reverse arr 1 4 5
reverse former arr 1 4 5
Program ended with exit code: 0
*/