向量(Vectors)
如若干个整数,所以称其为容器。Vector是C++STL(标准模板类库)的重要一员,使用她时,只要包括头文件#include<vector>即可。
vector<int>是模板形式,尖括号中为元素类型名,她可以是任何合法的数据类型。
//定义了10个整数元素的向量,但并没有给出初值,因此其值是不确定的。
//定义了10个整数元素的向量,且给出每个元素的初值为1。这种形式是数组望尘莫及的,
//数组只能通过循环来成批的赋给相同初值。
//用另一个现成的向量来创建一个向量。
//定义了其值依次为b向量中第0到第2个(共3个)元素的向量。 |
特别的,向量还可以从数组获得初值。例如:
int a[8]={2007,9,24,2008,10,14,10,5};
vector<int> va(a,a+8);
向量元素位置也属于一种类型,称为遍历器。遍历器不单表示元素位置,还可以在容器中前后挪动。
每种容器都有对应的遍历器。向量中的遍历器类型为:
vector<int>::iterator
因此要输入向量中所有元素,可以有两种循环控制方式:
for(int i=0; i<a.size(); ++i) //第一种方法
for(vector<int>::iterator it=a.begin(); it!=a.end(); ++it) //第二种方法
第一种方法是下标方式,a[i]是向量元素操作,这种形式和数组一样;
第二种方法是遍历器方式,*it是指针间访形式,它的意义是it所指向的元素值。
表示对该对象进行某个操作。
向量中的操作都是通过使用成员函数来完成的。它的常用操作有:
a.assign(b.begin(), b.begin()+3);
a.assign(4,2);
int x=a.back();
a.clear();
if(a.empty()) cout<<"empty";
int y=a.front();
a.pop_back();
a.push_back(5);
a.resize(10);
a.resize(10,2);
if(a=b) cout<<"epual";
|
这不仅因为数据的顺序排列性在生活中最常见,还因为向量中有一些插入、删除、搜索、判空等最简单的常规操作。
当数据并不复杂时,可以代替其他数据类型而很好的工作。特别是向量可以自动伸展,容量可以自动增大,
这对一些不确定数据量的容器工作带来了极大的方便。
1.向量-->添加元素
//向量-->添加元素 //例:读入一个文件yuexingtian.txt 的数据到向量中,文件中为一些整数(不知个数的情况)。 //要判断向量中的元素有多少个两两相等的数对,如下: //===============yuexingtian-->begin============================== //向量操作-->添加元素(例1) //============================================================ #include<iostream> #include<fstream> #include<vector> using namespace std; //------------------------------- int main() { } //========================end============thanks================= |
然后用添加操作不断往向量中添加元素。
向量并不是每次扩展都要扩容,向量中预留了一部分未用的元素供扩展之用。
如果上述程序面临着大量数据,比如10万个整数,这时候,为了保持向量的性能,应该在一开始就规定保留未用元素的数量。
yuexingtian.txt文件内容:
运行结果:
//===============yuexingtian-->begin==============================
//向量操作-->添加元素(例2) //============================================================
#include <iostream> #include <vector> #include <string> using namespace std; int main() { vector<string> sval; //定义一个向量 string str1("yue"); string str2("xing"); sval.push_back(str1); //在sval向量最后插入一个值,值为"yue" sval.push_back(str2); //在sval向量最后插入一个值,值为"xing" //========================end============thanks================= //=================http://yuexingtian.cublog.cn======================= |
运行结果:
DE>//二维向量(2-D Vectors) //在二维向量中,可以使用vector中的swap操作来交换两个向量。swap操作是专门为提高 //两向量直接互相交换的性能儿设计的。如果用一般的的swap: //eg:void sawp(vector<int>&a,vector<int>&b) // {vector<int> temp=a;a=b;b=temp;} //它涉及向量的创建、赋值、在赋值,最后还要销毁临时向量。但若用vector的swap操作, //这些工作都可以省掉。只要做微不足道的地址交换工作,岂不美哉?! //eg:文件yuexingtian.txt中含有一些行,每行中有一些整数,可以构成一个向量。 //整个文件可以看成是一组向量,其中每个元素又都是向量,只不过元素的向量其长度 //参差不齐。设计一个程序,使得按从短到长的顺序输出每个向量: //=============yuexingtian-->begin================== //如干个向量按长短排序 //================================================== #include<iostream> #include<fstream> #include<sstream> #include<vector> using namespace std; //---------------------------- typedef vector<vector<int> > Mat;DE> DE>DE> DE> Mat input(); void mySort(Mat &a); void print(const Mat &a); //---------------------------- int main() { Mat a=input(); mySort(a); print(a); return 0; } //---------------------------- Mat input()//输入 { ifstream in ("yuexingtian.txt"); Mat a; for (string s;getline(in,s);) {vector<int> b; istringstream sin(s); for(int ia; sin>>ia; )b.push_back(ia); a.push_back(b); } return a; } //---------------------------------- void mySort(Mat &a)//排序 { for(int pass=1;pass<a.size();++pass) for(int i=0;i<a.size()-pass;++i)if(a[i+1].size()<a[i].size()) a[i].swap(a[i+1]); } //----------------------------------- void print(const Mat &a)//输出 {for(int i=0;i<a.size();++i) { for(int j=0;j<a[i].size();++j)cout<<a[i][j]<<" "; cout<<endl; } }//=========================end======================== DE> |
运行结果:
yuexingtian.txt文件:
mySort是排序函数,他按向量元素个的多少进行排序,使用的是“冒泡法“。
用typedef来定义Mat这个二维向量的名字,以使程序中是名称易记易用。