通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。
与string 类一样vector 类是随标准C++引入的标准库的一部,为了使用vector 我们必须包含相关的头文件。
向量(vector) 连续存储的元素<vector>。使用vector 有两种不同的形式即所谓的数组习惯和STL习惯.
数组习惯:
vector <int> vec(10);
void simple_example()
{
const int elem_size = 10;
vector< int > ivec( elem_size );
int ia[ elem_size ];
for ( int ix = 0; ix < elem_size; ++ix )
ia[ ix ] = ivec[ ix ];
// ...
}
void print_vector( vector<int> ivec )
{
if ( ivec.empty() )
return;
for ( int ix = 0; ix < ivec.size(); ++ix )
cout << ivec[ ix ] << ' ';
}
// 把ia 的6 个元素拷贝到ivec 中
vector< int > ivec( ia, ia+6 );
第二个指针总是指向要被拷贝的末元素的下一位置标记出来的元素范围也可以是数组的一个子集例。
STL 习惯:
我们不是定义一个已知大小的vector 而是定义一个空vector
vector< string > text;
我们向vector 中插入元素而不再是索引元素以及向元素赋值例如push_back()操作就是在vector 的后面插入一个元素下面的 while 循环从标准输入读入一个字符串序列
并每次将一个字符串插入到vector 中
string word;
while ( cin >> word ) {
text.push_back( word );
// ...
}
虽然我们仍可以用下标操作符来迭代访问元素
cout << "words read are: \n";
for ( int ix = 0; ix < text.size(); ++ix )
cout << text[ ix ] << ' ';
更典型的做法是使用vector 操作集中的begin()和end()所返回的迭代器iterator对
cout << "words read are: \n";
for ( vector<string>::iterator it = text.begin();
it != text.end(); ++it )
cout << *it << ' ';
cout << endl
iterator 是标准库中的类它具有指针的功能
*it;
错误用法:
vector< int > ivec; //定义了一个空vector
再写这样的语句
ivec[ 0 ] = 1024;就是错误的。因为ivec 还没有第一个元素我们只能索引vector 中已经存在的元素.
类似地当我们用一个给定的大小定义一个vector 时例如
vector<int> ia( 10 );
任何一个插入操作都将增加vector 的大小而不是覆盖掉某个现有的元素,例如:ia.push_back('a') ia将包含11个元素。