科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件STL实践指南之STL的烦恼

STL实践指南之STL的烦恼

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

STL令人烦恼的地方是在它初始化的时候。STL中容器的初始化比C/C++数组初始化要麻烦的多。你只能一个元素一个元素地来。

作者:Jeff Bogan 来源:vchelp 2007年10月19日

关键字: STL 实践指南

  • 评论
  • 分享微博
  • 分享邮件
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;

  就可以避免错误。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章