标准模板库包含一个成为矢量(vector)的数据类型。它与一位数组类似,但与标准数组相比有一些优点。
标准模板库(STL)是程序员定义的数据类型和算法的集合,可以供C++程序使用。这些数据类型和算法不是C++语言的一部分,但它们的创建是对内置数据类型的有益补充。如果打算继续在计算机领域学习,那么就应该熟悉STL。现在介绍STL数据类型之一:矢量。
注意:要使用矢量,则程序的头文件必须指明使用namespace std,因为矢量包含在该命名空间中。许多较早的编译器不允许命名空间或不支持STL。
在STL中定义的数据类型通常称为容器(Container)。它们之所以称为容器,是因为他们存储和组织数据。STL中有两种类型的容器:顺序容器和关联容器。顺序容器以序列方式组织数据,类似于数组。关联容器使用关键字组织数据,它允许对存储在容器中的元素进行快速随机访问。
vector数据类型是一个序列式容器,它很像一个一维数组,其表现和数组相似的地方如下:
1)矢量包括一系列值或者元素。
2)矢量将其元素存储在连续的内存位置中。
3)可以使用数组下标运算符[]访问矢量中的各个元素。
但是,矢量相对于数组还有几个优点:
1)不必声明矢量将具有的元素的数量。
2)如果向已满的矢量添加值,则矢量将自动增加其大小以适应新值。
3)矢量可以报告它们包含的元素的数量。
1. 定义和初始化矢量
要在程序中使用矢量,则必须使用以下语句包含vector头文件: #include <vector>
创建矢量对象的语法与定义一个常规变量或数组所用的语法有所不同。以下是一个例子:
vector<int> numbers;
这个语句将numbers定义为一个int的矢量。请注意,数据类型包含在尖括号内,紧跟在单词vector之后。由于矢量的大小随着添加值而扩大,因此不需要声明大小。不过,如果愿意的话,也可以声明一个开始大小。示例如下:
vector<int> numbers(10);
这个语句将numbers定义为10个整数的矢量,但这只是一个起始大小。如果添加10以上的值,它的大小会扩大。
注意:如果为矢量指定开始的大小,则大小声明符将被括在圆括号中,而不是方括号中。
为矢量指定开始大小时,还可以指定一个初始化值。初始化值被复制到每个元素。示例如下:
vector<int> numbers(10,2);
在这个语句中,numbers被定义为10个整数矢量,并且numbers中的每个元素都被初始化值2。
也可以用另一个矢量中的值初始化一个矢量。例如,如果set1是已经有值的int矢量,则以下语句将创建一个名为set2的新矢量,它是set1的精确副本。 vector<int> set2(set1);
在执行这个语句之后,矢量set2将具有相同数量的元素,并保持与set1相同的一组值。
如果使用的是C++11版本,则还可以使用一个值列表来初始化vector,示例如下:
vector<int> numbers {10, 20, 30, 40};
该语句定义了一个名为numbers的int矢量。该矢量有4个元素,其初始化值为10,20,30和40。注意,初始化列表被括在一组大括号中,但是在它前面不使用赋值运算符(=)。
矢量定义示例:
定义格式 描述
vector<string> names; 将names定义为string对象的空矢量。
vector<int> scores(15); 将scores定义为15个整数的矢量。
vector<char> letters(25, 'A'); 将letters定义为25个字符的矢量。每个元素都用'A'初始化。
vector<double> values2(values1); 将values2定义为double矢量。value1的所有元素(也是double矢量)将被复制到values2。
vector<int> length {12, 10, 6}; 在C++11中,该语句定义length为3个int值的矢量,保存值12, 10和6。
2. 存储和检索矢量中的值
要将值存储到已存在的矢量元素中,或访问矢量元素中存储的数据,可以使用数组下标运算符[]。示例代码如下:
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
int main()
{
const int NUM_EMPS = 5;
vector <int> hours(NUM_EMPS);
vector <double> payRate(NUM_EMPS);
double grossPay;
cout<<"Enter the hours worked and hourly pay rates of "
<<NUM_EMPS<<" employees.
";
for(int index = 0; index < NUM_EMPS; index++)
{
cout<<"
Hours worked by employee #" << (index + 1) << ": ";
cin>>hours[index];
cout<<"Hourly pay rate for employee #"<<(index + 1) << ": ";
cin>>payRate[index];
}
//Display each employee's gross pay
cout<<"
Here is the gross pay for each employee:
";
cout<<fixed<<showpoint<<setprecision(2);
for(int index = 0; index < NUM_EMPS; index++)
{
grossPay = hours[index] * payRate[index];
cout<<"Employee #"<<(index + 1);
cout<<": $"<<setw(7)<<grossPay<<endl;
}
return 0;
}
结果:
3. 使用push_back成员函数
不能使用[]运算符来访问尚不存在的矢量元素。要将值存储在没有起始大小或已满的矢量中,应使用push_back成员函数。该函数接受一个值作为参数,并将其存储在位于矢量末尾的新元素中。
以下是一个使用push_back函数,将一个元素添加到一个名为numbers的int矢量的例子:
numbers.push_back(25);
该语句可以创建一个新的元素,其存储的值为25,该元素被放在numbers矢量的末尾。如果numbers以前没有元素,则新元素将成为其单一元素。
示例代码:
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
int main()
{
vector<int> hours;
vector<double> payRate;
double grossPay;
int numEmployees;
int index;
//get the number of employees
cout<<"How many employees do you have? ";
cin>>numEmployees;
cout<<"Enter the hours worked and hourly pay rates of the "
<<numEmployees << " employees.
";
for(index = 0; index < numEmployees; index++)
{
int tempHours;
double tempRate;
cout<<"Hours worked by employee #"<<(index+1)<<":";
cin>>tempHours;
hours.push_back(tempHours);
cout<<"Hourly pay rate for employee #"<<(index+1)<<":";
cin>>tempRate;
payRate.push_back(tempRate);
}
//Display each employee's gross pay
cout<<"
Here is the gross pay for each employee:
";
cout<<fixed<<showpoint<<setprecision(2);
for(index =0; index < numEmployees; index++)
{
grossPay = hours[index] * payRate[index];
cout<<"Employee #"<<(index+1);
cout<<": $"<<setw(7)<<grossPay<<endl;
}
return 0;
}
结果:
4. 确定矢量的大小
与数组不同,矢量可以报告它们包含的元素的数量,这是通过size成员函数实现的。以下是一个使用size成员函数的示例:
numValues = set.size();
在该语句中,假定numValues是一个int, set是一个矢量。执行语句后,numValues将包含set中的元素数量。
在编写接收矢量作为实参的函数时,size成员函数特别有用。例如,来看showValues函数的代码:
void showValues(vector<int> vect)
{
for(int i = 0; i < vect.size(); i++)
cout<<vect[i]<<endl;
}
因为矢量可以报告其大小,所以该函数不需要第二个参数来表示矢量中元素的个数。示例程序如下:
#include <iostream>
#include <vector>
using namespace std;
void showValues(vector<int>);
int main()
{
vector <int> values;
//store a series of numbers int the vector
for(int count = 0; count < 7; count++)
values.push_back(count * 2);
//Display the numbers
showValues(values);
return 0;
}
void showValues(vector<int> vect)
{
for(int count = 0; count < vect.size(); count++)
cout<<vect[count]<<" ";
cout<<endl;
}
结果:
5. 从矢量中删除元素
要从矢量中删除最后一个元素,可以使用pop_bach成员函数。以下语句从名为collection的矢量中移除最后一个元素:
collection.pop_back();
程序示例:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values;
//Store values in the vector
values.push_back(1);
values.push_back(2);
values.push_back(3);
cout<<"The size of values is "<<values.size()<<endl;
//Remove a value from the vector
cout<<"Popping a value from the vector...
";
values.pop_back();
cout<<"The size of values is now "<<values.size()<<endl;
//Now remove another value from the vector
cout<<"Popping a value from the vector...
";
values.pop_back();
cout<<"The size of values is now "<<values.size()<<endl;
//Remove the last value from the vector
cout<<"Popping a value from the vector ...
";
values.pop_back();
cout<<"The size of values is now "<<values.size()<<endl;
return 0;
}
结果:
注意:pop_back函数是一个void函数,它不返回将从矢量中删除的值。以下代码行将不起作用:
cout<<"The value being removing from the vector is "
<<values.pop_back()<<endl; //Error!
6. 清理矢量
要完全清除矢量的内容,可以使用clear成员函数,如下所示:
numbers.clear();
在执行该语句后,numbers的所有元素将被清除。示例代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector < int > values(100);
cout<<"The values vector has "
<<values.size()<<" elements.
";
cout<<"I will call the clear member function ...
";
values.clear();
cout<<"Now the values vector has "
<<values.size()<<" elements.
";
return 0;
}
结果:
7. 检测一个空矢量
要确定一个矢量是否为空,可以使用empty成员函数。如果矢量为空,则该函数将返回true;如果矢量中存储有元素,则返回false。假设numberVector是一个矢量,以下是其应用示例:
if(numberVector.empty())
cout<<"No values in numberVector. ";
示例代码:
#include <iostream>
#include <vector>
using namespace std;
double avgVector(vector<int>);
int main()
{
vector<int> values;
int numValues;
double average;
cout<<"How many values do you want to average? ";
cin>>numValues;
//Get the values and store them in a vector
for(int count = 0; count < numValues; count++)
{
int tempValue;
cout<<"Enter an integer values: ";
cin>>tempValue;
values.push_back(tempValue);
}
//Get the average of the values and display it
average = avgVector(values);
cout<<"Average: "<<average<<endl;
return 0;
}
double avgVector(vector<int> vect)
{
int total = 0;
double avg = 0.0;
if(vect.empty())
cout<<"No values to average.
";
else
{
for(int count = 0; count < vect.size(); count++)
total+=vect[count];
avg = static_cast<double>(total)/vect.size();
}
return avg;
}
结果:
8. 矢量成员函数汇总
成员函数 描述
at(position) 返回vector中位于position位置的元素的值。
示例:x = vect.at(5); //将vect[5]的赋值给x
capacity() 返回在不重新分配额外内存的情况下,可能存储在矢量中的最大元素数量(它和由size成员函数返回的值并不是一回事)。
示例: x = vect.capacity(); //将vect的容量赋值给x。
clear() 清楚矢量的所有元素。
示例: vect.clear(); //从vect中移除所有元素
empty() 如果vector是空的,则返回true。否则,它返回false。示例:
if( vect.empty() ) //如果该矢量是空的
cout << "The vector is empty."; //显示该消息
pop_back() 从矢量中删除最后一个元素。
示例: vect.pop_back(); //移除vect的最后一个元素 ,使其大小减去1
push_back(value) 在矢量的最后一个元素中存储一个值。如果矢量已满或为空,则会创建一个新元素。
示例: vect.push_back(7); //在vect的最后一个元素中存储7.
reverse() 反转矢量中元素的顺序(最后一个元素变成第一个元素,第一个元素成为最后一个元素)。
示例: vect.reverse(); //反转vect中元素的顺序
resize(n)、resize(n,value) 调整矢量的大小以使其具有n个元素,其中n大于矢量当前大小。如果包含可选的参数value,则每个新元素都将使用该value值进行初始化。如果不指定value的话,所有没有元素的位置上都被初始化为0,vect当前已经有4个元素情况下的示例:
vect.resize(6,99) //将两个元素添加到矢量的末尾,每个元素的初始化为99
size() 返回矢量中元素的数量。示例:
numElements = vect.size();
swap(vector2) 将矢量的内容与vector2的内容交换。示例:
vect1.swap(vect2); //交换vect1和vect2的内容