stl的基本概念

本文介绍了C++ STL(标准模板库)的基本概念,包括算法、容器和迭代器。STL提供了如vector、deque、list等序列式容器,以及set、map等关系型容器。迭代器作为容器的导航工具,允许访问和操作容器中的元素。算法如排序、查找等通过迭代器操作元素。此外,文章还展示了如何在实际代码中使用和操作STL容器,包括插入、删除、遍历等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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");

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值