Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16501170
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:27:09

下载本文示例代码
  STL令人烦恼的地方是在它初始化的时候。STL中容器的初始化比C/C 数组初始化要麻烦的多。你只能一个元素一个元素地来,或者先初始化一个普通数组再通过转化填放到容器中。我认为人们通常可以这样做: //程序:初始化演示//目的:为了说明STL中的向量是怎样初始化的。#include <cstring> // <cstring>和<string.h>相同#include <vector>using namespace std;int ar[10] = { 12, 45, 234, 64, 12, 35, 63, 23, 12, 55 };char* str = "Hello World";int main(int argc, char* argv[]){ vector <int> vec1(ar, ar 10); vector <char> vec2(str, str strlen(str)); return 0;}  在编程中,有很多种方法来完成同样的工作。另一种填充向量的方法是用更加熟悉的方括号,比如下面的程序: //程序:vector演示二//目的:理解带有数组下标和方括号的STL向量#include <cstring>#include <vector>#include <iostream>using namespace std;char* szHW = "Hello World";int main(int argc, char* argv[]){ vector <char> vec(strlen(sHW)); //为向量分配内存空间 int i, k = 0; char* cptr = szHW; while (*cptr != '\0') { vec[k] = *cptr; cptr ; k ; } for (i=0; i<vec.size(); i ) { cout << vec[i]; } cout << endl; return 0;}  这个例子更加清晰,但是对游标(iterator)的操作少了,并且定义了额外的整形数作为下标,而且,你必须清楚地在程序中说明为向量分配多少内存空间。  命名空间(Namespace)  与STL相关的概念是命名空间(namespace)。STL定义在std命名空间中。有3种方法声明使用的命名空间:  1.用using关键字使用这个命名空间,在文件的顶部,但在声明的头文件下面加入: using namespace std;  这对单个工程来说是最简单也是最好的方法,这个方法可以把你的代码限定在std命名空间中。  2.使用每一个模板前对每一个要使用的对象进行声明(就像原形化): using std::cout;using std::endl;using std::flush;using std::set;using std::inserter;  尽管这样写有些冗长,但可以对记忆使用的函数比较有利,并且你可以容易地声明并使用其他命名空间中的成员。  3.在每一次使用std命名空间中的模版时,使用std域标识符。比如: typedef std::vector VEC_STR;  这种方法虽然写起来比较冗长,但是是在混合使用多个命名空间时的最好方法。一些STL的狂热者一直使用这种方法,并且把不使用这种方法的人视为异类。一些人会通过这种方法建立一些宏来简化问题。  除此之外,你可以把using namespace std加入到任何域中,比如可以加入到函数的头部或一个控制循环体中。  一些建议  为了避免在调试模式(debug mode)出现恼人的警告,使用下面的编译器命令: #pragma warning(disable: 4786)  另一条需要注意的是,你必须确保在两个尖括号之间或尖括号和名字之间用空格隔开,因为是为了避免同“>>”移位运算符混淆。比如 vector <list<int>> veclis;  这样写会报错,而这样写: vector <list <int> > veclis;  就可以避免错误。   STL令人烦恼的地方是在它初始化的时候。STL中容器的初始化比C/C 数组初始化要麻烦的多。你只能一个元素一个元素地来,或者先初始化一个普通数组再通过转化填放到容器中。我认为人们通常可以这样做: //程序:初始化演示//目的:为了说明STL中的向量是怎样初始化的。#include <cstring> // <cstring>和<string.h>相同#include <vector>using namespace std;int ar[10] = { 12, 45, 234, 64, 12, 35, 63, 23, 12, 55 };char* str = "Hello World";int main(int argc, char* argv[]){ vector <int> vec1(ar, ar 10); vector <char> vec2(str, str strlen(str)); return 0;}  在编程中,有很多种方法来完成同样的工作。另一种填充向量的方法是用更加熟悉的方括号,比如下面的程序: //程序:vector演示二//目的:理解带有数组下标和方括号的STL向量#include <cstring>#include <vector>#include <iostream>using namespace std;char* szHW = "Hello World";int main(int argc, char* argv[]){ vector <char> vec(strlen(sHW)); //为向量分配内存空间 int i, k = 0; char* cptr = szHW; while (*cptr != '\0') { vec[k] = *cptr; cptr ; k ; } for (i=0; i<vec.size(); i ) { cout << vec[i]; } cout << endl; return 0;}  这个例子更加清晰,但是对游标(iterator)的操作少了,并且定义了额外的整形数作为下标,而且,你必须清楚地在程序中说明为向量分配多少内存空间。  命名空间(Namespace)  与STL相关的概念是命名空间(namespace)。STL定义在std命名空间中。有3种方法声明使用的命名空间:  1.用using关键字使用这个命名空间,在文件的顶部,但在声明的头文件下面加入: using namespace std;  这对单个工程来说是最简单也是最好的方法,这个方法可以把你的代码限定在std命名空间中。  2.使用每一个模板前对每一个要使用的对象进行声明(就像原形化): using std::cout;using std::endl;using std::flush;using std::set;using std::inserter;  尽管这样写有些冗长,但可以对记忆使用的函数比较有利,并且你可以容易地声明并使用其他命名空间中的成员。  3.在每一次使用std命名空间中的模版时,使用std域标识符。比如: typedef std::vector VEC_STR;  这种方法虽然写起来比较冗长,但是是在混合使用多个命名空间时的最好方法。一些STL的狂热者一直使用这种方法,并且把不使用这种方法的人视为异类。一些人会通过这种方法建立一些宏来简化问题。  除此之外,你可以把using namespace std加入到任何域中,比如可以加入到函数的头部或一个控制循环体中。  一些建议  为了避免在调试模式(debug mode)出现恼人的警告,使用下面的编译器命令: #pragma warning(disable: 4786)  另一条需要注意的是,你必须确保在两个尖括号之间或尖括号和名字之间用空格隔开,因为是为了避免同“>>”移位运算符混淆。比如 vector <list<int>> veclis;  这样写会报错,而这样写: vector <list <int> > veclis;  就可以避免错误。 下载本文示例代码


STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼STL实践指南之STL的烦恼
阅读(131) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~