3.3.6 循环访问string对象
具备了前面介绍的有关for循环和string对象的新知识后,循环访问string对象中的单个字符就变得非常简单,如下面的代码所示:
for (unsigned int i = 0; i < phrase.size(); ++i)
{
cout << "Character at position " << i << " is: " << phrase[i] << endl;
}
循环从0开始直到11,访问了phrase的所有合法位置。每次迭代过程中,通过phrase[i]显示string对象的字符。注意,循环变量i是unsigned int型的,因为size()的返回值是无符号的整型值。
现实世界
序列的循环访问是游戏中一项强大且常用的技术。例如,您也许要在策略游戏中循环访问数以百计的独立单元,更新它们的状态和顺序,或者要循环访问一连串3D模型顶点来实现某种几何变换。
3.3.7 使用find()成员函数
接下来程序使用成员函数find()来检查两个字符串字面值是否包含在phrase中。首先检查的是字符串字面值"Over":
cout << "\nThe sequence 'Over' begins at location ";
cout << phrase.find("Over") << endl;
find()成员函数在string对象中搜索作为实参提供的"Over"字符串。该成员函数的返回值是要搜索的string对象在调用string对象中第一次出现的位置。也就是说,phrase.find("Over")返回"Over"在phrase中第一次出现的位置。因为phrase为"Lame Over!!!",所以find()的返回值为5(记住,位置从0开始,所以5表示第6个字符)。
但是如果要搜索的字符串在调用字符串中不存在,结果会怎样?下面介绍了处理这种情况的方法:
if (phrase.find("eggplant") == string::npos)
{
cout << "'eggplant' is not in the phrase.\n\n";
}
因为phrase中不存在"eggplant",所以find()返回文件string中定义的一个特殊常量,该常量通过string::npos来访问。因此,屏幕显示消息“'eggplant' is not in the phrase.”。
通过string::npos访问的常量表示string对象可能的最大长度。因此,它比对象中的任意可能的合法位置都要大。通俗地讲,它表示“一个不可能存在的位置”。这是说明无法找到子字符串的绝佳返回值。
提示
当使用find()时,可以提供一个可选实参,用于指定查找子字符串的起始位置。下面一行代码将从string对象phrase的位置5开始查找字符串字面值"eggplant"。
location = phrase.find("eggplant", 5);