4.3 使用迭代器
迭代器是将容器的潜力发挥到极致的关键。迭代器可以用于循环访问序列容器。另外,STL的某些重要部分需要用到迭代器。许多容器的成员函数和STL算法将迭代器作为其实参。因此,如果希望从成员函数和算法中获益,就必须使用迭代器。
4.3.1 Hero's Inventory 3.0程序简介
Hero's Inventory 3.0程序至少在一开始同它的两个前身的行为是一样的。该程序列出所有物品,替换掉第一个物品,然后显示某个物品名称的字母数目。但是,该程序此后做出一些新的操作:在向量的起始位置插入一个元素,然后从向量中间移除一个元素。这些都是通过迭代器来完成的。程序的运行示例如图4-2所示。
|
| (点击查看大图)图4-2 程序实现了一些只能用迭代器完成的向量操作 |
从Course Technology网站(www.courseptr.com/downloads)或本书合作网站(http://www. tupwk.com.cn/downpage)上可以下载该程序的代码。程序位于Chapter 4文件夹中,文件名为heros_inventory3.cpp。
- // Hero's Inventory 3.0
- // Demonstrates iterators
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- int main()
- {
- vector<string> inventory;
- inventory.push_back("sword");
- inventory.push_back("armor");
- inventory.push_back("shield");
- vector<string>::iterator myIterator;
- vector<string>::const_iterator iter;
- cout << "Your items:\n";
- for (iter = inventory.begin(); iter != inventory.end(); ++iter)
- {
- cout << *iter << endl;
- }
- cout << "\nYou trade your sword for a battle axe.";
- myIterator = inventory.begin();
- *myIterator = "battle axe";
- cout << "\nYour items:\n";
- for (iter = inventory.begin(); iter != inventory.end(); ++iter)
- {
- cout << *iter << endl;
- }
- cout << "\nThe item name '" << *myIterator << "' has ";
- cout << (*myIterator).size() << " letters in it.\n";
- cout << "\nThe item name '" << *myIterator << "' has ";
- cout << myIterator->size() << " letters in it.\n";
- cout << "\nYou recover a crossbow from a slain enemy.";
- inventory.insert(inventory.begin(), "crossbow");
- cout << "\nYour items:\n";
- for (iter = inventory.begin(); iter != inventory.end(); ++iter)
- {
- cout << *iter << endl;
- }
- cout << "\nYour armor is destroyed in a fierce battle.";
- inventory.erase((inventory.begin() + 2));
- cout << "\nYour items:\n";
- for (iter = inventory.begin(); iter != inventory.end(); ++iter)
- {
- cout << *iter << endl;
- }
- return 0;
- }