下载本文示例代码
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) |