STL简介:
STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工做时所开发出来的。这多是一个历史上最使人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其余一些组件的集合。这里的“容器”和算法的集合指的是世界上不少聪明人不少年的杰做。STL的目的是标准化组件,这样就不用从新开发,可使用现成的组件。STL如今是C++的一部分,所以不用额外安装什么。
STL被内建在你的编译系统以内。
在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。ios
STL通常包括六大组件:
容器,算法,迭代器,仿函式,配接器,配置器。程序员
vector简介:
vector是C++标准模板库中的部份内容,中文偶尔译做“容器”,但并不许确。它是一个多功能的,可以操做多种数据结构和算法的模板类和函数库。vector之因此被认为是一个容器,是由于它可以像容器同样存放各类类型的对象,简单地说,vector是一个可以存听任意类型的动态数组,可以增长和压缩数据。
算法
/*- ========================================================== * 文件名 :vector1.cpp * 开发人员:袁培荣 * 当前版本:1.0.0.2595 * 建立时间:2012-05-20 * 修改时间:2012-05-20 * 功能说明:STL vector 介绍连载1 * 版权说明:版权全部 袁培荣 YuanPeirong * 编译环境:Windows 7(x64) SP1 简体中文专业版 * 编译器: Visual Studio 2010 SP1(中文旗舰版) MinGW 20120426 GNU GCC 4.6.2(主力编译器) Visual C++ 6.0 SP6(中文企业版) - ==========================================================*/ #include <iostream> #include <vector> //包含STL 的vector 头文件才能使用vector using std::cout; using std::endl; using std::vector; //vector是一个类模板,定义在命名空间std里面 int main(int argc, char* argv[]) { //vector类的四种构造方法 vector<int> v1; //默认构造函数,v1为空 vector<int> v2(v1); //v2构造为v1的一个副本 vector<int> v3(10,5); //v3包含10个值为5的元素 vector<int> v4(10); //v4包含含有初始化值的元素的10个副本 //用.size()成员函数取得各vector对象包含的元素个数,并输出 vector<int>::size_type l1=v1.size(); //.size()函数的返回类型为: vector<int>::size_type l2=v2.size(); //vector<T>::size_type vector<int>::size_type l3=v3.size(); //不过也能够用int型来接收 vector<int>::size_type l4=v4.size(); //但建议用标准类型vector<T>::size_type cout<<"l1="<<l1<<endl; cout<<"l2="<<l2<<endl; cout<<"l3="<<l3<<endl; cout<<"l4="<<l4<<endl; //输出各vector对象包含的元素的值 vector<int>::size_type i; cout<<endl<<"输出v1值"<<endl; for(i=0; i!=v1.size(); i++) //C++程序员习惯于!=来进行判断 cout<<v1[i]<<" "; //而非<或>或<=或>= //这种用!=的方式更加科学和安全 cout<<endl<<"输出v2值"<<endl; //这里,虽然v1,v2是空的 for(i=0; i!=v2.size(); i++) //但for循环不会出错 cout<<v2[i]<<" "; //只是循环体一次也不执行就结束for循环 cout<<endl<<"输出v3值"<<endl; for(i=0; i!=v3.size(); i++) cout<<v3[i]<<" "; //另外,咱们能够经过 对象名[下标] //的方法来访问vector对象中各元素的值 cout<<endl<<"输出v4值"<<endl; //下标从0开始,到 长度-1 结束 for(i=0; i!=v4.size(); i++) cout<<v4[i]<<" "; v3[5]=35; //对象名[下标] 的方式可做右值,也可做左值 cout<<endl<<"v3[5]="<<v3[5]<<endl; return 0; } //========================= // 运行结果: //========================= // l1=0 // l2=0 // l3=10 // l4=10 // 输出v1值 // 输出v2值 // 输出v3值 // 5 5 5 5 5 5 5 5 5 5 // 输出v4值 // 0 0 0 0 0 0 0 0 0 0 // v3[5]=35 //=========================
/*- ========================================================== * 文件名 :vector2.cpp * 开发人员:袁培荣 * 当前版本:1.0.0.2595 * 建立时间:2012-05-20 * 修改时间:2012-05-20 * 功能说明:STL vector 介绍连载2 * 版权说明:版权全部 袁培荣 YuanPeirong * 编译环境:Windows 7(x64) SP1 简体中文专业版 * 编译器: Visual Studio 2010 SP1(中文旗舰版) MinGW 20120426 GNU GCC 4.6.2(主力编译器) Visual C++ 6.0 SP6(中文企业版) - ==========================================================*/ #include <iostream> #include <vector> //包含STL 的vector 头文件才能使用vector using std::cout; using std::endl; using std::vector; //vector是一个类模板,定义在命名空间std里面 int main(int argc, char* argv[]) { vector<int> v1; vector<int> v2(10); //.empty()成员函数返回对象是不是空的 bool bv1=v1.empty(); //若是为空,返回ture bool bv2=v2.empty(); //若是不为空,返回flase cout<<"测试empty()成员函数"<<endl; if(bv1) cout<<"v1是空的"<<endl; else cout<<"v1不是空的"<<endl; if(bv2) cout<<"v2是空的"<<endl; else cout<<"v2不是空的"<<endl; // "==" 操做符用来判断两个对象是否相等 // 同时 !=, <, >, <=, >=这些操做符保持有惯有含义 cout<<"测试 == 操做符"<<endl; if(v1==v2) cout<<"v1与v2相同"<<endl; //若是相等返回true else cout<<"v1与v2不相同"<<endl; //若是不相等返回false //"=" 操做符可用于对象间赋值 v1=v2; //把v1的元素替换为v2中的元素的副本 //此时v1再也不为空,而是和v2相等,证实以下 bv1=v1.empty(); cout<<"测试 = 操做符"<<endl; if(bv1) cout<<"v1是空的"<<endl; else cout<<"v1不是空的"<<endl; if(v1==v2) cout<<"v1与v2相同"<<endl; else cout<<"v1与v2不相同"<<endl; return 0; } //========================= // 运行结果: //========================= // 测试empty()成员函数 // v1是空的 // v2不是空的 // 测试 == 操做符 // v1与v2不相同 // 测试 = 操做符 // v1不是空的 // v1与v2相同 //=========================
/*- ========================================================== * 文件名 :vector3.cpp * 开发人员:袁培荣 * 当前版本:1.0.0.2595 * 建立时间:2012-05-20 * 修改时间:2012-05-20 * 功能说明:STL vector 介绍连载3 * 版权说明:版权全部 袁培荣 YuanPeirong * 编译环境:Windows 7(x64) SP1 简体中文专业版 * 编译器: Visual Studio 2010 SP1(中文旗舰版) MinGW 20120426 GNU GCC 4.6.2(主力编译器) Visual C++ 6.0 SP6(中文企业版) - ==========================================================*/ #include <iostream> #include <vector> //包含STL 的vector 头文件才能使用vector using std::cout; using std::endl; using std::vector; //vector是一个类模板,定义在命名空间std里面 int main(int argc, char* argv[]) { vector<int> v1(1); vector<int> v2(10); //下标操做不能用于添加元素,由于下标越界不容许 //下面是演示,由于是错误代码,由于被注释 //下面想经过下标操做为v1加入5个元素,这是非法的 //并且这种错误在编译时是不报错的,但在运行时会出错 //显然这种错误更可怕 //=====错误代码起 // for(vector<int>::size_type i=1; i!=6; i++) // v1[i]=i; //=====错误代码止 //其实这种错误就是下标越界 //由于v1只存在 v1[0] 而v1[1]到v[5]是不存在的,由于是不能访问的 //由于系统没有为它们分配内存空间,根本访问不到 //正确添加元素,咱们要用到.push_back(t)成员函数 //.push_back(t)接受一个元素值t,并将其添加到对象的最后面 cout<<"测试push_back(t)成员函数"<<endl; cout<<"添加前:"<<endl; cout<<"v1[0]="<<v1[0]<<endl; for(vector<int>::size_type j=1; j!=6; j++) { v1.push_back(j); cout<<"添加v1["<<j<<"]="<<v1[j]<<endl; } return 0; } //========================= // 运行结果: //========================= // 测试push_back(t)成员函数 // 添加前: // v1[0]=0 // 添加v1[1]=1 // 添加v1[2]=2 // 添加v1[3]=3 // 添加v1[4]=4 // 添加v1[5]=5 //========================= //========================= //总结: //========================= //vector是C++标准中STL组件的核心内容之一 //它采用最新的泛型编程技术实现,其本质是一个类模板 //vector能够用来替换不安全的数组操做 //而且它能够动态的增减元素 //(这里没有演示减,主要是要和后面的迭代器一块儿介绍) //这是数组所不能作到的。 //相比JAVA的vector的增减机制,C++的vector更加灵活和科学 //数组能够配合指针进行灵活操做,这一点Java的数组不行 //而C++的vector能够配合迭代器进行更灵活操做,这一点Java的vector不行 //C++的vector和迭代器能够很好地替代不安全的数组和指针 //咱们在编程时要尽可能不用数组,能用迭代器的地方可用其代替指针 //而尽量的采用vector和迭代器 //固然,数组能够不用,指针仍是不能被取代的 //C++99标准的推出了智能指针 //而C++11标准更是推出了两个更加智能的指针 //========================= //接下去,将介绍迭代器和vector的配合使用。 //=========================