今天我们将更新 C++ STL 中 vector 容器的使用,之前我们介绍了 array 容器的使用,其实容器之间有很多相似的地方,这些相似的地方我会稍微提一提,重点放在其他部分。
vector 容器的创建与初始化
vector<T> 是含 T 类型元素的容器, 与 array< T , N > 不同的是,vector<T> 容器的大小是可以自动增长,从而理论上可以包含任意数量的元素。因此类型参数 T 不再需要指定其大小。当元素个数超出 vector 当前容量,就会自动分配更多的空间。
vector<T> 可以很好地代替数组,尽管在容器中增加和删除元素时会有一些开销,但是这个开销相对较小,不会对你的程序有明显的影响。vector<T> 容器在头文件 vector 中。
当然如果你不想记这些头文件,使用
#include <bits/stdc++.h>
也是可以的。
vector<int> data;
上面时定义一个存放 int 的 vector 容器,由于容器里面没用元素,也就没有分配空间。我们可以使用reserve(n) 来增加容器的容量。但是必须得注意得是,当前容器得容量大于n,并不能增加该容器的大小,同时即使使用了 reserve() ,容器内依然没有任何数据,容器没有得到内存,只有增加了元素后,容器才会得到内存。
示例如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> data1;
cout<<"data1: "<<data1.size()<<endl;
data1.reserve(5);
cout<<"data1: "<<data1.size()<<endl;
cout<<endl;
vector<int> data2(6);
cout<<"data2: "<<data2.size()<<endl;
data2.reserve(5);
cout<<"data2: "<<data2.size()<<endl;
return 0;
}
结果如下:

size() 是得到容器的大小,array 中有,其他容器也是有的。
同时需要注意到的是,使用了 reserve() 增加容器的内存后,现有的迭代器会失效,因为容器发生改变了,而且动态分配内存是有一定的开销的,最好就在初始化时分配,指定其大小。
vector<int> data1 {1,1,2,3,5};
这样初始化时,data1 的大小就是 5 了,同时每个位置都被分配了初值。
值得注意的是,在 array 中,我们可以这样
array<int,10> data1 {1,1,2,3,5};
前五个元素被赋值,后五个元素保存默认,容器大小为10。
vector<int> data2(10);
这样初始化时,data2 的大小为10,所有元素保持默认值。
vector<int> data3(10,1);
data3 的大小为10,所有元素默认值为1。
示例如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> data1 {1,1,2,3,5};
vector<int> data2(10);
vector<int> data3(10,1);
cout<<"data1: "<<data1.size()<<endl;
for(auto&& data : data1){
cout<<data<<" ";
}
cout<<endl;
cout<<"data2: "<<data2.size()<<endl;
for(auto&& data : data2){
cout<<data<<" ";
}
cout<<endl;
cout<<"data3: "<<data3.size()<<endl;
for(auto&& data : data3){
cout<<data<<" ";
}
cout<<endl;
return 0;
}
结果如下:

我们知道 reserve() 可以增加容器的容量;这时元素的个数并没有改变。但是通过调用成员函数 resize() 可以改变容器大小,也可以指定容器中部分元素的值,以一个例子为例。
示例如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> data1 {1,1,2,3,5};
cout<<"data1: "<<data1.size()<<endl;
for(auto& data : data1){
cout<<data<<" ";
}
cout<<endl;
data1.resize(10);
cout<<"data1: "<<data1.size()<<endl;
for(auto& data : data1){
cout<<data<<" ";
}
cout<<endl;
data1.resize(15,1);
cout<<"data1: "<<data1.size()<<endl;
for(auto& data : data1){
cout<<data<<" ";
}
cout<<endl;
data1.resize(4);
cout<<"data1: "<<data1.size()<<endl;
for(auto& data : data1){
cout<<data<<" ";
}
cout<<endl;
data1.resize(3,1);
cout<<"data1: "<<data1.size()<<endl;
for(auto& data : data1){
cout<<data<<" ";
}
cout<<endl;
return 0;
}
结果如下:

vector 访问元素
我们可以使用方括号进行索引,从 0 开始,和数组类似。
示例如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> data1(10,1);
for(int i=2;i<data1.size();i++){
data1[i]=data1[i-1]+data1[i-2];
}
for(auto& data : data1){
cout<<data<<" ";
}
cout<<endl;
return 0;
}
结果如下:

之前,我们在 array 容器中介绍了 front() ,back(),swap() 成员函数,而在 vector 容器中这些也是一样的作用。
示例如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> data1(10,1);
for(int i=2;i<data1.size();i++){
data1[i]=data1[i-1]+data1[i-2];
}
int first=data1.front();
auto last=data1.back();
cout<<"the first elemmet is "<<first<<endl;
cout<<"the last elemmet is "<<last<<endl;
cout<<endl;
swap(data1.front(),data1.back());
cout<<"the first elemmet is "<<data1.front()<<endl;
cout<<"the last elemmet is "<<data1.back()<<endl;
return 0;
}
结果如下:

之后将介绍 vector 的迭代器以及其他的使用。
网友评论