//程序:vector演示一
//目的:理解STL中的向量
// #include "stdafx.h" --如果你使用预编译的头文件就包含这个头文件
#include
#include
using namespace std; //保证在程
char* szHW = "Hello World";
//这是一个字符数组,以”\0”结束。
int main(int argc, char* argv[])
{
vector
//为字符数组定义一个游标iterator。
vector
//初始化字符向量,对整个字符串进行循环,
//用来把数据填放到字符向量中,直到遇到”\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
#include
int ar[10] = { 12, 45, 234, 64, 12, 35, 63, 23, 12, 55 };
char* str = "Hello World";
int main(int argc, char* argv[])
{
vector
vector
return 0;
}
在编程中,有很多种方法来完成同样的工作。另一种填充向量的方法是用更加熟悉的方括号,比如下面的
程序:
//程序:vector演示二
//目的:理解带有数组下标和方括号的STL向量
#include
#include
#include
using namespace std;
char* szHW = "Hello World";
int main(int argc, char* argv[])
{
vector
int i, k = 0;
char* cptr = szHW;
while (*cptr != '\0')
{ vec[k] = *cptr; cptr++; k++; }
for (i=0; i { cout << vec[i]; } cout << endl; return 0; } 这个例子更加清晰,但是对游标(iterator)的操作少了,并且定义了额外的整形数作为下标,而且,你必 须清楚地在程序中说明为向量分配多少内存空间。