STL学习系列之三:操作list容器- -
Tag: c++ STL list
学习完了STL系列之二,自己写了个程序练手!程序采用的还是系列之二文章的架构。学习了STL之一和之二,对于STL的基本原理算有个个基本的了解。其实关于这几种容器,以前也都接触过,不过是在java上,当时学习时也是囫囵吞枣!现在感觉那真是学习之大忌,还是一步一个脚印为好。速度可以放慢点,那要扎实!
注意:程序在vc6下调试通过,对于不清楚如何在vc下运行STL者,可以读STL系列之一。
//TjuAiLab
//Author:zhangbufeng
//Time:2005.8.23 22:00
#include <string>
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
PrintString(const string& StringToPrint);
const string NameCode("Bufeng");
class IsBufeng
{
public:
bool operator()(string &StringName)
{
return StringName.substr(0,6)==NameCode;
}
};
void main(void)
{
//定义一个list
list<string>AIStudentName;
list<string>TargetAIStudentName;
list<string>::iterator AIStudentNameIterator;
//使用的list的成员函数push_back和puch_front插入元素到list中,使用成员函数insert任意插入
AIStudentName.push_back("BufengZhang");
AIStudentName.push_back("YangZhang");
AIStudentName.push_back("KunHuang");
AIStudentName.push_front("ChengLuo");
AIStudentName.push_front("YonghuoYang");
AIStudentName.push_front("XiaoyuanCui");
AIStudentName.insert(AIStudentName.end(),"KefeiGong");
TargetAIStudentName.push_back("BufengZhang");
TargetAIStudentName.push_back("YangZhang");
//使用list的成员函数empty判断list是否为空,size来返回成员个数
if(AIStudentName.empty())
{
cout<<"AIStudentName的成员为空"<<endl;
}
else
{
cout<<"AIStudentName的成员个数为"<<AIStudentName.size()<<endl;
}
//使用for循环和迭代器处理list的元素
cout<<"AIStudentName的成员如下(使用for循环和迭代器:"<<endl;
for(AIStudentNameIterator=AIStudentName.begin();AIStudentNameIterator!=AIStudentName.end();
AIStudentNameIterator++)
{
cout<<*AIStudentNameIterator<<endl;
}
//使用STL的通用算法for_each来处理list中的元素
cout<<"AIStudentName的成员如下(使用STL的通用算法for_each:"<<endl;
for_each(AIStudentName.begin(),AIStudentName.end(),PrintString);
//学习使用STL的通用算法count和count_if
int NumberofStudent=0;
NumberofStudent=count (AIStudentName.begin(),AIStudentName.end(),"BufengZhang");
cout<<"TjuAIlab中有"<<NumberofStudent<<"个BufengZhang"<<endl;
NumberofStudent=count_if(AIStudentName.begin(),AIStudentName.end(),IsBufeng());
cout<<"TjuAIlab中有"<<NumberofStudent<<"个BufengZhang"<<endl;
//使用STL通用算法find()在list中查找对象
AIStudentNameIterator=find(AIStudentName.begin(),AIStudentName.end(),"BufengZhang");
if(AIStudentNameIterator==AIStudentName.end())
cout<<"AIStudentName中没有BufengZhang"<<endl;
else
cout<<"在AIStudentName中可以找到BufengZhang"<<endl;
//使用STL通用算法find_if在list中查找对象
AIStudentNameIterator=find_if(AIStudentName.begin(),AIStudentName.end(),IsBufeng());
if(AIStudentNameIterator==AIStudentName.end())
cout<<"AIStudentName中没有BufengZhang"<<endl;
else
cout<<"在AIStudentName中可以找到BufengZhang"<<endl;
//使用STL通用算法search在list中找一个序列
AIStudentNameIterator = search(AIStudentName.begin(),AIStudentName.end(),TargetAIStudentName.begin(),TargetAIStudentName.end());
if(AIStudentNameIterator==AIStudentName.end())
cout<<"AIStudentName中没有找到BufengZhang And YangZhang"<<endl;
else
cout<<"在AIStudentName中可以找到BufengZhang And YangZhang"<<endl;
//使用list的成员函数sort()排序一个list
AIStudentName.sort();
cout<<"排序如下:"<<endl;
for_each(AIStudentName.begin(),AIStudentName.end(),PrintString);
//使用list的成员函数删除元素(pop_front,pop_back,erase(),remove())
AIStudentName.pop_front();
AIStudentName.pop_back();
AIStudentName.erase(AIStudentName.begin());
AIStudentName.remove("XiaoyuanCui");
cout<<"剩余成员如下:"<<endl;
for_each(AIStudentName.begin(),AIStudentName.end(),PrintString);
//使用STL通用算法remove()从list中删除元素
AIStudentNameIterator=remove(AIStudentName.begin(),AIStudentName.end(),"YangZhang");
cout<<"remove后剩余成员如下:"<<endl;
for_each(AIStudentName.begin(),AIStudentNameIterator,PrintString);
}
PrintString(const string& StringToPrint)
{
cout<<StringToPrint<<endl;
}
STL学习系列之四:STL学习小结(转贴)- -
Tag: c++ vc STL
![]() |
| ||||||||||||||||||||||||||||||||||||||||||||||||||
提供了类型安全、高效而易用特性的STL无疑是最值得C++程序员骄傲的部分。每一个C++程序员都应该好好学习STL:). STL(Standard Template Library 标准模板库)是C++标准库的一个重要组成部分,它由Stepanov and Lee等人最先开发,它是与C++几乎同时开始开发的;一开始STL选择了Ada作为实现语言,但Ada有点不争气,最后他们选择了C++,一个原因了,C++中已经有了模板。在后来,STL又被添加进了C++库。1996年,惠普公司又免费公开了STL,为STL的推广做了很大的贡献。 STL大体上包括container(容器)、algorithm(算法)和iterator(迭代器),容器和算法通过迭代器可以进行无缝连接。 STL体现了范型编程的思想,它具有高度的可重用性,高性能,高移植性。程序员不用思考具体实现过程,只要能够熟练的应用就OK了。(有兴趣研究具体实现的,可以看侯捷老师编著的《STL源码剖析》)这样他们就可以把精力放在程序开发的别的方面。 我非常佩服创造STL的那些计算机和数学精英。因为他们做了一件非常辛苦的事情―――抽象概念。而STL就是通过把容器抽象为统一的接口,算法利用这个接口,通过迭代器来操纵容器。因为接口不变,实现的容器可以随意更改。这样,就为编程、调试和扩展提供了便利。也许有一天,我们生产软件的时候也可以想DIY一台PC一样简单,只要拿来相应的实现模块,通过简单的拼装和调试就可以创造一个软件。这是多么令人兴奋的一件事^_^.不过,到时候,可能会有很多程序员失业了。呵呵,毕竟编写类库不需要很多的人员。 虽然STL不是面向对象的,但,我想,每个人都会为它的创造力和高性能而感到兴奋和折服。 一、容器
考虑到不同的实际需要,更主要的是效率的需要,我们可以选择不同的容器来实现我们的程序,以此达到我们提高性能的目的。这也是用好STL的一个难点,但这也是关键。 二、算法 STL的算法也是非常优秀的,它们大部分都是类属的,基本上都用到了C++的模板来实现,这样,很多相似的函数就不用自己写了,只要用函数模板就OK了。 我们使用算法的时候,要针对不同的容器,比如:对集合的查找,最好不要用通用函数find(),它对集合使用的时候,性能非常的差,最好用集合自带的find()函数,它针对了集合进行了优化,性能非常的高。 三、迭代器
由此可见,指针和迭代器还是有很大差别的。和指针最接近的就是随机访问迭代器。下面是一个我编写的小例子:功能是分别对数组,向量,表,多重集合进行插入操作,对每个容器插入100万个随机整数;
这个程序清晰的表明这几种容器在插入速度之间的差别,当然,每种容器不是万能的,不能一好百好。比如说,多集在查找方面的优势是其他序列容器不可比拟的。 还有,最好不要试图超越STL,因为: 但是,超越STL不是不可能的。但是一般情况下,你只能靠牺牲可移植性来提高性能,这对于很多情况来说是很不好的。为了,超越STL,我们要付出非常大的努力。而且,最好我们知道一些STL专家们不知道的东西,尔后我们可以有针对性的进行优化,否则,我们的努力完全有可能白费。 面对这样一个优秀的库,并且它是免费的。我们C++程序员没有理由拒绝它,甚至去自己开发一个库。 |