一、STL组件
程序的主要目标是管理数据和产生结果,然而获得这样的目标需要把数据存储到计算机内存中、访问指定的数据,以及写算法来管理数据等能力。
例如,若我们要操作的所有数据是同类型的,且知道数据的数目, 那么我们可以使用数组来存储数据。此时,我们可以使用索引来访问数组特定的组件。利用循环和数组索引,我们可以遍历数组元素。算法,像初始化数组,排序,搜索,用来管理数组中存储的数据。
若我们不知道数据的数目,那么我们可以使用链表(Linked List)来处理。若数据需要以后进先出(LIFO)方式进行处理,那么我们可以使用栈(Stack)。相似的,若数据需要以先进先出(FIFO)方式来进行处理,那么我们可以使用队列(Queue)。
STL就是具有这些特性来有效的管理数据。更加正式的说,STL具有如下三个主要组件:
- 容器(Containers)
- 迭代器(Iterators)
- 算法(Algorithms)
- 序列容器(也称为顺序容器)——Sequence containers(also called sequential containers)
- 关联容器——Associative containers
- 容器适配器——Container adapters
- vector
- deque
- list
#include <vector>
另外,定义vector变量时,需要指定其对象的类型。因为类vector是类模版,例如:
vector<int> intList;
声明了intList为一个vector变量,组件类型为int。类似的,如下语句:
vector<string> stringList;
声明了stringList是一个vector容器,组件类型是string。
管理vector中的数据
如何对存储在vector容器中的数据进行管理呢?为了管理vector容器中的数据,我们必须要知道如下的操作:
- 元素插入
- 元素删除
- 遍历vector容器中元素
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//声明一个大小为5的vector容器intList
vector<int> intList(5);
//通过循环存储元素到intList中
for(int i = 0; i < 5; i++)
{
intList[i] = i;
}
//通过循环输出intList中的元素
for(int i = 0; i < 5; i++)
{
cout << intList[i] << endl;
}
return 0;
}
类vector同时也包含成员函数用来查看当前容器中元素数目,以及最大可以插入到容器的元素数目等。下表描述了一些操作。
上表中,标识符position,beg和end在STL术语中称为迭代器,迭代器就像一个指针一样,通过,迭代器用来遍历容器中的元素。也就是说,通过迭代器,我们可以遍历和处理容器中的元素每次一个。如下实例展示了如何使用push_back():
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//声明一个vector容器intList
vector<int> intList;
//通过push_back()存储元素到intList中
intList.push_back(34);
intList.push_back(55);
//通过循环输出intList中的元素
for(int i = 0; i < intList.size(); i++)
{
cout << intList[i] << endl;
}
return 0;
}
声明vector容器的迭代器
类vector包含定义的interator(typedef interator),其声明为public成员,vector容器的interator使用typedef interator来进行声明,例如:
vector<int>::interator intVecIter;
声明了一个类型为int的vector容器的interator为intVecIter。
由于interator是类vector内部的一个typedef定义的。因此,我们必须使用容器名(vector),容器元素类型和范围解析操作符来使用typedef迭代器。
表达式++intVecIter让intVecIter指向容器下一个元素,表示*intVecIter返回当前迭代器位置的元素。
从这些操作,我们可知这些操作和指针的操作一样。
如下讨论如何使用vector容器中的迭代器老管理存储在vector容器中的数据。
假设有如下表达式:
vector<int> intList;
vector<int>::iterator intVecIter;
第一行声明一个vector容器的intList变量,元素类型为int。
第二行声明了vector容器中的迭代器intVecIter。
容器和函数begin与end
每个容器都有成员函数begin和end,函数begin()返回容器中第一个元素的位置。函数end()返回容器中最后一个元素的位置,同时这些函数没有参数,
执行如下语句:
intVecIter = intList.begin();
这样迭代器intVecIter指向了容器intList中的第一个元素。如下for循环输出intList中的元素
//通过interator输出intList中的元素
for(intVecIter = intList.begin(); intVecIter != intList.end(); ++intVecIter)
{
cout << *intVecIter << " ";
}
下例展示了vector中insert函数的使用
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int intArray[7] = {1, 3, 5, 7, 9, 11, 13};
//声明一个vector容器intList
vector<int> intList(intArray, intArray + 7);
vector<int>::iterator intVecIter;
intVecIter = intList.begin();
++intVecIter;
intList.insert(intVecIter, 22);
//通过interator输出intList中的元素
for(intVecIter = intList.begin(); intVecIter != intList.end(); ++intVecIter)
{
cout << *intVecIter << " ";
}
return 0;
}
intVecIter首先初始化为intList的第一个元素,然后++intVecIter让其指向第二个元素,接着通过insert函数操作在intVecIter指定的位置插入22。这样,intList = {1, 22, 3, 5, 7, 9, 11,13}。注意,此时容器的大小也增加了。
如下示例展示了如何在一个在程序中使用vector容器,以及如何处理vector容器中的元素
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//声明一个vector容器intList
vector<int> intList;
intList.push_back(13);
intList.push_back(75);
intList.push_back(28);
intList.push_back(35);
cout << "List Elements:";
for(int i = 0; i < 4; i++)
{
cout << intList[i] << " ";
}
cout << endl;
for(int i = 0; i < 4; i++)
{
intList[i] *=2;
}
cout << "Now, List Elements:";
for(int i = 0; i < 4; i++)
{
cout << intList[i] << " ";
}
cout << endl;
vector<int>::iterator intVecIter;
cout << "Through Iterator, List Elements:";
//通过interator输出intList中的元素
for(intVecIter = intList.begin(); intVecIter != intList.end(); ++intVecIter)
{
cout << *intVecIter << " ";
}
cout << endl;
intVecIter = intList.begin();
++intVecIter;
++intVecIter;
intList.insert(intVecIter, 88);
cout << "Now, Through Iterator, List Elements:";
//通过interator输出intList中的元素
for(intVecIter = intList.begin(); intVecIter != intList.end(); ++intVecIter)
{
cout << *intVecIter << " ";
}
cout << endl;
return 0;
}
输出为: