STL中vector向量初始化问题

来源:互联网 发布:cn域名注册 编辑:程序博客网 时间:2024/05/18 22:51
一个hello world程序。这个程序将一个字符串传送到一个字符
向量中,然后每次显示向量中的一个字符。向量就像是盛放变长数组的花园,大约所有STL容器中有一半
是基于向量的,如果你掌握了这个程序,你便差不多掌握了整个STL的一半了。  

//程序:vector演示一

//目的:理解STL中的向量

 

// #include "stdafx.h" --如果你使用预编译的头文件就包含这个头文件

#include <vector>  // STL向量的,头这里没有".h"。

#include <iostream>  // 包含cout对象的头文件。

using namespace std;  //保证在程

 

char* szHW = "Hello World";  

//这是一个字符数组,以”\0”结束。

 

int main(int argc, char* argv[])

{

  vector <char> vec;  //声明一个字符向量vector (STL中的数组) 

 

  //为字符数组定义一个游标iterator。

  vector <char>::iterator vi;

 

  //初始化字符向量,对整个字符串进行循环,

  //用来把数据填放到字符向量中,直到遇到”\0”时结束。

  char* cptr = szHW;  // 将一个指针指向“Hello World”字符串

  while (*cptr != '\0')

  {  vec.push_back(*cptr);  cptr++;  }

  // push_back函数将数据放在向量的尾部。

 

// 将向量中的字符一个个地显示在控制台

  for (vi=vec.begin(); vi!=vec.end(); vi++)  

  // 这是STL循环的规范化的开始——通常是 "!=" ,  而不是 "<"

  // 因为"<"  在一些容器中没有定义。 

  // begin()返回向量起始元素的游标(iterator),end()返回向量末尾元素的游标(iterator)。

  {  cout << *vi;  }  // 使用运算符  “*”  将数据从游标指针中提取出来。

  cout << endl;  // 换行

 

  return 0;

}

 

 

push_back是将数据放入vector(向量)或deque(双端队列)的标准函数。Insert是一个与之类似的函数,然

而它在所有容器中都可以使用,但是用法更加复杂。end()实际上是取末尾加一(取容器中末尾的前一个元

素),以便让循环正确运行——它返回的指针指向最靠近数组界限的数据。就像普通循环中的数组,比如for

(i=0; i<6; i++) {ar[i] = i;} ——ar[6]是不存在的,在循环中不会达到这个元素,所以在循环中不会出现问题。 

 

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)的操作少了,并且定义了额外的整形数作为下标,而且,你必

须清楚地在程序中说明为向量分配多少内存空间。

原创粉丝点击