STL令人烦恼的地方是在它初始化的时候。STL中容器的初始化比C/C++(www.cppentry.com)数组初始化要麻烦的多。你只能一个元素一个元素地来,或者先初始化一个普通数组再通过转化填放到容器中。我认为人们通常可以这样做:
//程序:初始化演示 //目的:为了说明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; } |
在编程(www.cppentry.com)中,有很多种方法来完成同样的工作。另一种填充向量的方法是用更加熟悉的方括号,比如下面的程序:
//程序: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关键字使用这个命名空间,在文件的顶部,但在声明的头文件下面加入:
这对单个工程来说是最简单也是最好的方法,这个方法可以把你的代码限定在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; |
就可以避免错误。
|