1.STL(Standard Template Library,标准模板库)是惠普实验室开发的,在被引入C++之前该技术就已经存在了很长的一段时间。
2.STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器)
3.将容器中的数据通过迭代器送到算法中进行运算,得到我想要的结果
4.容器相当于类模板。
5.容器可分为:序列式容器(线性的),关系型容器(非线性的)。
6.序列式容器,是可序群集,其中每个元素均有固定位置,元素的位置取决于插入时机和地点,和元素值无关。如果在容器尾添加6个元素,它们的排列次序将和添加次序一致。STL提供3个定义好的序列式容器:vector,deque,list
7.关系型容器,是一种已序群集,元素位置取决于特定的排序准则。如果将6个元素添加到这样的群集中,它们的位置取决于元素值,和插入次序无关。STL提供了4个关系型容器:set,multiset,map,multimap。
8.STL容器都必须满足以下3个条件:
1)容器进行元素的插入操作时,内部实现的是拷贝操作,置于容器内。因此STL容器内的每一个元素都必须能够被拷贝。也就是说要存放到容器内的对象具有公有属性的拷贝构造函数。如果容器内放置的是指针类型的数据则无此要求。
2)总体而言,所有元素形成一个次序。也就是说多次遍历每个元素时的次序总是相同的。
3)一般而言,各项操作并非绝对安全。调用者必须确保传给操作函数的参数符合需求,违反这些需求(例如使用非法索引)会导致未定义的行为,通常STL在这个情况下不会抛出异常。
11.迭代器:迭代器是一个“可遍历STL容器內全部或部分元素”的对象。一个迭代器用來指出容器中的一个特定位置。
12.几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
13.将迭代器前进至下一个元素。大多数迭代器还可使用operator--退回到前一个元素。(比如在链表中指针的偏移)
14.容器中的所有区间都是左闭右开的。
15.begin()返回一个迭代器,指向容器起始点,也就是第一个元素(如果有的话)的位置。
16.end()返回一个迭代器,指向容器结束点。结束点在最后一个元素之后,这样的迭代器又称作“逾尾”迭代器。指向最后一个元素的下一个位置。
17.算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
18.<algorithm>是所有STL头文件中最大的一个,它是由一大堆函数模版组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
19.<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
20.<functional>中则定义了一些模板类,用以声明函数对象。
21.代码如下图:
#include "Utility.h"
//---------------STL中的vector容器及其迭代器---------------
template<typename T> void PrintContainer( T _container )
{
//容器的正向迭代器定义格式:
//容器类模板名::iterator 迭代器名 = 容器对象名.begin();
for( T::iterator iter = _container.begin() ;
iter != _container.end() ;
++iter)
{
//通过迭代器取出当前它所迭代的元素:
//要利用:"迭代器的解引用/取内容"
cout<<(*iter)<<" , ";
}
cout<<endl;
}
template<typename T> void PrintContainer_Reverse(T _container)
{
for( T::reverse_iterator rIter = _container.rbegin() ;
rIter != _container.rend();
++rIter
)
{
cout<<(*rIter)<<",";
}
cout<<endl;
}
void main()
{
vector<int> iVector1; //定义了一个int型vector容器
iVector1.~vector<int>();//调用析构函数释放空间
vector<int> iVector2(iVector1);//产生一个同型容器,iVector2与iVector1一模一样
if(iVector2.empty())
cout<<"iVector2容器为空"<<endl;
int iArray3[10]= {1,2,3,4,5,6,7,8,9,10};
vector<int> iVector3(&iArray3[0],&iArray3[5]);//[beg,end) 包含beg,但是不包含end
if(!iVector3.empty())
{
//size()函数的返回值类型为unsigned int
cout<<"iVecto3中元素个数为:"<<iVector3.size()<<endl;
}
vector<int> iVector4(&iArray3[5],&iArray3[10]);
比较规则:逐个比较,一旦比较出结果,
就不再继续向下比较剩余元素
//if(iVector3 < iVector4)
//cout<<" < "<<endl;
//else if(iVector3 > iVector4)
//cout<<" > "<<endl;
//else
//cout<<"两容器相等"<<endl;
//----swap函数,交换数据----
iVector3.swap(iVector4);//vector容器自有交换函数swap
swap(iVector3,iVector4);//STL包含的算法swap
cout<<"iVector3中正向输出元素为:";
PrintContainer(iVector3);
cout<<"iVector3中逆向输出元素为:";
PrintContainer_Reverse(iVector3);
cout<<"iVector4中元素为:";
PrintContainer(iVector4);
cout<<"iVector4中逆向输出元素为:";
PrintContainer_Reverse(iVector4);
//-------vector容器的元素插入操作---------
vector<int> iVector5;
iVector5.push_back(11);
iVector5.push_back(22);
iVector5.push_back(44);
iVector5.push_back(55);
cout<<"iVector5中元素为:";
PrintContainer(iVector5);
vector<int>::iterator pos = iVector5.begin();
pos+=2;
/*
***********!重要 !************
当容器中数据发生变化时,原本指向该
容器的迭代器将失效,需要重新定位迭
代器。
*******************************
*/
//插入位置,插入数据
iVector5.insert(pos,33);
pos = iVector5.begin();
pos+=3; //!!!迭代器的重定向!!!
//在pos位置插入10个0
iVector5.insert(pos,3,0);
pos = iVector5.begin();
pos+=3; //!!!迭代器的重定向!!!
//在pos位置插入&iArray3[7]到&iArray3[10]之间的元素
iVector5.insert(pos,&iArray3[7],&iArray3[10]); //[First,Last)
cout<<"iVector5中元素为:";
PrintContainer(iVector5);
pos = iVector5.begin();
pos+=3; //!!!迭代器的重定向!!!
//移除指定位置的数据
iVector5.erase(pos);
cout<<"移除数据后,iVector5中元素为:";
PrintContainer(iVector5);
//移除指定区间的数据
vector<int>::iterator beg = iVector5.begin();
vector<int>::iterator end = iVector5.end();
iVector5.erase(beg,end-1);
cout<<"移除数据后,iVector5中元素为:";
PrintContainer(iVector5);
//清除容器中所有元素
iVector5.clear();
cout<<"清除数据后,iVector5中元素为:";
PrintContainer(iVector5);
//------"读写型"迭代器------
vector<int> iVector6;
iVector6.push_back(1);
iVector6.push_back(2);
iVector6.push_back(3);
iVector6.push_back(4);
for( vector<int>::iterator iter = iVector6.begin();
iter!=iVector6.end(); ++iter )
{
(*iter)+=10;
}
cout<<"iVector6中的内容为:";
PrintContainer(iVector6);
//------"只读型"迭代器------
vector<int>::const_iterator c_iter = iVector6.begin();
//(*c_iter) += 10;//反例:不能对只读型迭代器进行赋值操作
system("pause");
}