您的位置:首页 > 其它

迭代器介绍

2015-04-23 18:44 127 查看
我们知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有一种更通用的机制也可以实现同样的目的,这就是迭代器

 1. 迭代器的使用

获取迭代器不是使用取地址符,而是具有迭代器的类型同时会拥有返回迭代器的成员。比如:begin和end,其中begin成员负责返回指向第一个元素的迭代器,end成员负责返回指向容器尾元素的下一位的迭代器,也就是说,该迭代器自带的元素是一个本不存在的“尾后”元素,这样的迭代器仅作为一个标记,表示我们已经处理完容器中的所有元素。如果容器为空,则begin和end返回的是同一个迭代器,即尾后迭代器!

迭代器的运算符
*iter              //返回迭代器iter所指元素的引用
iter->men         //解引用iter并获取该元素的名为men的成员,等价于(*iter.men)
++iter            //令迭代器指向容器中的下一个元素
iter1==iter2     //判断两个迭代器是否相等


注意:执行解引用的迭代器必须合法并确实指示着某个元素

示例:将字符串的第一个字母大写!
string s("some string");
if(s.begin() !=s.end())
{
auto it=s.begin();
*it=toupper(*it);
}


示例:将字符串的第一个单词改为大写
string s("some string");
for(auto it=s.begin();it !=s.end() && !isspace(*it);++it)
*it=toupper(*it);

迭代器的类型
就像不知道string和vector的size_type成员到底是什么类型一样,一般来说我们也不知道迭代器的精确类型。而实际上,那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型:
vector<int>::iterator it;
string::iterator it2;
结合解引用和成员访问操作:
(*it).emty()
it->empty();    //这两种方式实现的效果是相同的
注意:任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
迭代器的运算
iter + n
iter+=n
iter1-iter2
iter1<iter2
迭代器可以实现类似的运算功能
至此,迭代器的介绍结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: