博文

使用前向和反向迭代器遍历list(2010-10-19 17:37:00)

摘要: #include <iostream>
#include <list>
using namespace std; int main(int argc, char* argv[])
{
     int iArr[] = { 1,2,3,4,5,6,7,8,9 };
     list<int> myList(iArr,iArr+9);
     list<int>::iterator it = myList.begin();
     int iTemp = 0;
     // 前向iterator
     cout << "Normal data: \n";
     for (it=myList.begin(); it!=myList.end(); it++)
     {
          cout << *it << " ";
     }
     cout << "\n";      // 反向iterator
     list <int>::reverse_iterator rIt; 
  &n......

阅读全文(7737) | 评论:0

C++ 标准模板库(2010-07-16 14:20:00)

摘要:C++ 标准模板库(STL) C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等. C++ STL 提供给程序员以下三类数据结构的实现: 顺序结构 C++ Vectors C++ Lists C++ Double-Ended Queues 容器适配器 C++ Stacks C++ Queues C++ Priority Queues 联合容器 C++ Bitsets C++ Maps C++ Multimaps C++ Sets C++ Multisets 程序员使用复杂数据结构的最困难的部分已经由STL完成. 如果程序员想使用包含int数据的stack, 他只要写出如下的代码: stack<int> myStack; 接下来, 他只要简单的调用 push() 和 pop() 函数来操作栈. 借助 C++ 模板的威力, 他可以指定任何的数据类型,不仅仅是int类型.  STL stack实现了栈的功能,而不管容纳的是什么数据类型.......

阅读全文(1806) | 评论:0

C++的iostream标准库介绍(2009-02-06 17:51:00)

摘要:C++的iostream标准库介绍 作者:管宁 * C++的iostream标准库介绍 o 0 为什么需要iostream o 1 iostream: istream 和 ostream o 2 fstream: ifstream 和 ofstream o 3 strstream: ostrstream 和 istrstream o 4 stringstream o 5 io_state 输入/输出的状态标志 0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。   iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。   为什么说要扩展才能提供支持呢?我们来一个示例。 #include #include using namespace std; class Test { public: Test(int a=0,int b=0) { Test::a=a; Test::b=b; } int a; int b; }; int main() { Test t(100,50); printf("%???",t);//不明确的输出格式 scanf("%???",t);//不明确的输入格式 couta表示将数据放入a对象中。 2. ......

阅读全文(2277) | 评论:0

【转】VC6.0+icc编译STLPort5.2(2009-01-06 12:48:00)

摘要:帅得不敢出门
C++哈哈堂          31843264
编程`灌水`交流    24372952
C++爱好者灌水天堂   3503799
VC6.0(sp6)+Intel c++ Compiler For Windows v9.0.025 Final编译STLPort5.2.1 转载请保留此信息
*/
编译前的准备:请确保 环境变量 path中有D:\vc6.0\MSDev98\Bin 原因及如何设置后面会说到(没设置的可先看后面)
1. 到www.stlport.org下载STLPort。我下载的是stlport5.2.1
   (http://sourceforge.net/project/showfiles.php?group_id=146814)
2. 把下载的stlport压缩包解压,我假设解压到D:\VC98\STLport(其子目录是src,doc,stlport等目录)
3. 编译stlport
(1)编译d:\VC98\bin\vcvars32.bat
给INCLUDE 变量 加上 %MSVCDir%\STLport\stlport
给LIB变量加上 %MSVCDir%\STLport\lib
改后应为
set INCLUDE=%MSVCDir%\STLport\stlport;%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%
set LIB=%MSVCDir%\STLport\lib;%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB% 开启一个console窗口, 运行 d:\VC98\bin\vcvars32.bat
如果成功会提示:
Setting environment for using Microsoft Visual C++ tools.
(2)CD到STLport目录下执行如下命令:
D:\VC98\STLport>c......

阅读全文(7551) | 评论:1

[转]C++ STL轻松导学(2008-12-30 12:56:00)

摘要: 名称 C++ STL轻松导学  作者 晨光(Morning)  简介 本教程介绍有关学习C++ STL的预备知识和STL的相关背景知识,适合想对STL做大致了解的初学者。  声明 本教程版权为晨光(Morning)所有,未经允许,请勿复制、传播,谢谢。  目录1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.3.1 STL和C++ 1.3.2 STL和C++标准库 1.3.3 STL和GP,GP和OOP 1.4 STL的不同实现版本 1.4.1 HP STL 1.4.2 P.J. Plauger STL 1.4.3 Rouge Wave STL 1.4.4 STLport 1.4.5 SGI STL 2 牛刀小试:且看一个简单例程 2.1 引子 2.2 例程实作 2.2.1 第一版:史前时代--转木取火 2.2.2 第二版:工业时代--组件化大生产 2.2.3 第三版:唯美主义的杰作 2.3 历史的评价 2.4 如何运行
作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事。因此,如果你在看完本节之后还是觉得似懂非懂,大可不必着急,在阅读了后续内容之后,相信你对STL的认识,将会愈加清晰、准确和完整。不过,上述这番话听起来是否有点像是在为自己糟糕的表达能力开脱罪责呢?:) 不知道你是否有过这样的经历。在你准备着手完成数据结构老师所布置的家庭作业时,或者在你为你所负责的某个软件项目中添加一项新功能时,你发现需要用到一个链表(List)或者是映射表(Map)之类的东西......

阅读全文(3758) | 评论:1

C++ STL编程轻松入门基础(2007-12-01 20:27:00)

摘要:作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事。因此,如果你在看完本节之后还是觉得似懂非懂,大可不必着急,在阅读了后续内容之后,相信你对STL的认识,将会愈加清晰、准确和完整。不过,上述这番话听起来是否有点像是在为自己糟糕的表达能力开脱罪责呢?:) 不知道你是否有过这样的经历。在你准备着手完成数据结构老师所布置的家庭作业时,或者在你为你所负责的某个软件项目中添加一项新功能时,你发现需要用到一个链表(List)或者是映射表(Map)之类的东西,但是手头并没有现成的代码。于是在你开始正式考虑程序功能之前,手工实现List或者Map是不可避免的。于是……,最终你顺利完成了任务。或许此时,作为一个具有较高素养的程序员的你还不肯罢休(或者是一个喜欢偷懒的优等生:),因为你会想到,如果以后还遇到这样的情况怎么办?没有必要再做一遍同样的事情吧! 如果说上述这种情形每天都在发生,或许有点夸张。但是,如果说整个软件领域里,数十年来确实都在为了一个目标而奋斗--可复用性(reusability),这看起来似乎并不夸张。从最早的面向过程的函数库,到面向对象的程序设计思想,到各种组件技术(如:COM、EJB),到设计模式(design pattern)等等。而STL也在做着类似的事情,同时在它背后蕴涵着一种新的程序设计思想--泛型化设计(generic programming)。 继续上面提到的那个例子,假如你把List或者map完好的保留了下来,正在暗自得意。且慢,如果下一回的List里放的不是浮点数而是整数呢?如果你所实现的Map在效率上总是令你不太满意并且有时还会出些bug呢?你该如何面对这些问题?使用STL 是一个不错的选择,确实如此,STL可以漂亮地解决上面提到的这些问题,尽管你还可以寻求其他方法。 说了半天,到底STL是什么东......

阅读全文(2628) | 评论:0

STL使用入门( Using STL) (2007-12-01 19:34:00)

摘要:0 前面的话(Winter) C++已经在中国相当普及,但C++ STL却使用的人不多。许多人有一定成见,认为STL降低了C++的效率。特别是那些自诩为技术专家的人,他们一直使用C语言,对于新事物总是先用批判的眼光对待......先不说这些,我这几天看见http://stl.winterxy.com网站上的这篇小文,发现写得简明扼要,通俗易懂。翻译出来,希望对STL的普及有一定帮助。 1 介绍 我最开始结束C++编程是从DOS下的Borland C++开始的。那时他们在最新版本3.1中就包含了一套模板库用来做collection.那真是个好东东。当我开始使用Visual C++ 2.2的时候,我甚至试图去把Borland公司的collection模板库嵌入到Visual C++中去,但是没有成功。唯一可行的解决方案是切换到微软(Microsoft)的collection上,它是MFC的一部分分。但总是有些问题,其原因如下: 一旦实现部分已经代码写完,很难从一种容器(container)类型切换到另外一种容器。 不同容器的迭代器(Iterators)不一样。 如果你在写一个DLL(动态链接库), 服务程序(service)或者终端应用程序,需要用到容器,你要么动态要么静态链接MFC,这使得你不得不依赖于MFC. 最近我开始使用STL,发现它真是太棒了!入门可能稍微难一些,但一旦你开始了,它就变得非常容易。本文包含了一些使用STL的入门经验,主要是面向那些希望能快速使用STL又不想了解那些琐碎细节的程序员。 2 规则 Rule 1: 你可以生成STL容器,用来存放对象或者指向对象的指针。 class TMyClass; typedef list<TMyClass> TMyClassList; // 用于存放对象的list容器 typedef list<TMyClass*> TMyClassPtrList; // 用于存放对象指针的list容器一般来说,list容器用于存放对象。但是,如果你是需要保存一些机器资源(例如,文件句柄,命名管道、套接字(socket)或者其他类似的资源),那么你需要使用list来保存指向这些对象的指针。 如果容器是保存的对象,则在容器析构的时候会自动清理这些......

阅读全文(2467) | 评论:0

STL之父访谈录 (2007-05-11 21:10:00)

摘要:  翻译者: myan
出处: http://www.sgi.com/technology/stl

1995年3月,dr.dobb's journal特约记者, 著名技术书籍作家al stevens采访了stl创始人alexander stepanov. 这份访谈纪录是迄今为止对于stl发展历史的最完备介绍, 侯捷先生在他的stl有关文章里推荐大家阅读这篇文章. 因此我将该文全文翻译如下:

q: 您对于generic programming进行了长时间的研究, 请就此谈谈.
a: 我开始考虑有关gp的问题是在70年代末期, 当时我注意到有些算法并不依赖于数据结构的特定实现,而只是依赖于该结构的几个基本的语义属性. 于是我开始研究大量不同的算法,结果发现大部分算法可以用这种方法从特定实现中抽象出来, 而且效率无损. 对我来说,效率是至关重要的, 要是一种算法抽象在实例化会导致性能的下降, 那可不够棒.
  
   当时我认为这项研究的正确方向是创造一种编程语言. 我和我的两个朋友一起开始干起来.一个是现在的纽约州立大学教授deepak kapur, 另一个是伦塞里尔技术学院教授david musser.当时我们三个在通用电器公司研究中心工作. 我们开始设计一种叫tecton的语言. 该语言有一种我们称为"通用结构"的东西, 其实不过是一些形式类型和属性的集合体, 人们可以用它来描述算法. 例如一些数学方面的结构充许人们在其上定义一个代数操作, 精化之,扩充之, 做各种各样的事.

   虽然有很多有趣的创意, 最终该项研究没有取得任何实用成果, 因为tecton语言是函数型语言. 我们信奉backus的理念,相信自己能把编程从von neumann风格中解放出来. 我们不想使用副效应, 这一点限制了我们的能力, 因为存在大量需要使用诸如"状态", "副效应"等观念的算法.  

   我在70年代末期在tecton上面所认识到了一个有趣的问题: 被广泛接受的adt观念有着根本性的缺陷. 人们通常认为adt的特点是只暴露对象行为特征, 而将实现隐藏起来. 一项操作的复杂度被认为是与......

阅读全文(3692) | 评论:1

标准模板库介绍(2007-05-07 19:19:00)

摘要:标准模板库介绍 标准模板库,也叫 STL,是一个 C++ 容器类库,算法和迭代器。他提供许多基本算法,数据结构。STL 是一个通用库,即可以充份定制:几乎所有的 STL 组件都是模板。在你使用 STL 前,你必须了解模板的工作情况。

容器和算法
和许多类库一样,STL 包含容器类 - 可以包含其他对象的类。STL 包含向量类,链表类,双向队列类,集合类,图类,等等。他们中的每个类都是模板,能包含各种类型的对象。例如,你可以用 vector<int> ,就象常规的 C 语言中的数组,除了 vector 不要你象数组那样考虑到动态内存分配的问题。

vector<int> v(3); // 定义一个有三个元素的向量类
v[0] = 7;
v[1] = v[0] + 3;
v[2] = v[0] + v[1]; // v[0] == 7, v[1] == 10, v[2] == 17

STL 还包含了大量的算法。他们巧妙地处理储存在容器中的数据。你能够颠倒 vector 中的元素,只是简单使用 reverse 算法。

reverse(v.begin(), v.end()); // v[0] == 17, v[1] == 10, v[2] == 7

在调用 reverse 的时候有两点要注意。首先,他是个全局函数,而不是成员函数。其次,他有两个参数,而不是一个:他操作一定范围的元素而不是操作容器。 在这个例子中他正好是对整个容器 V 操作。

以上两点的原因是相同的:reverse 和其他 STL 算法一样,他们是通用的,也就是说, reverse 不仅可以用来颠倒向量的元素,也可以颠倒链表中元素的顺序。甚至可以对数组操作。下面的程序是合法的。

double A[6] = { 1.2, 1.3, 1.4, 1.5, 1.6, 1.7 };
reverse(A, A + 6);
for (int i = 0; i < 6; ++i)
cout << "A[" << i << "] = " << A[i];

这个例子也用到......

阅读全文(2353) | 评论:0