C++ 初读迭代器
迭代器
这是个啥?
string对象或vector对象可以通过下标访问每一个元素,迭代器也具有同样的效果。那又有什么不同呢?事实上并不是所有的容器到可以使用下标访问每一个元素,即在容器上迭代器更具普适性。string类支持迭代器,同vector一样。
Use
有的迭代器类型是有返回值的,可是事实上我们不用管它。使用auto就可以愉快地迭代。
auto a = v.begin();
auto e = v.end();
//只读不写
auto a = v.cbegin();
auto e = v.cend();
值得注意的是,end是指向容器“尾元素的下一个元素”,称为尾后迭代器,简称尾迭代器。
标准迭代器运算符
它类似于指针,但不会使用取地址符。
运算符 | 含义 |
---|---|
*iter | return & |
iter -> men | =(*iter).men,获取men成员 |
++iter | 下一个元素 |
--iter | 上一个元素 |
iter1 == iter2 | 是否指向同一个元素或尾后迭代器 |
iter1 != iter2 |
注:(*iter).men,称为解引用。
小试牛刀
string s("hello world");
if(s.begin()!=s.end()){ //not null
auto it = s.begin();
*it='a'; //change value
}
来个循环
for(auto it = s.cbegin();it != s.cend();++it)
{
cout<<*it;
}
cout<<endl;
注:C++习惯使用"!=",其原因是这种编程风格在标准库中所有容器均有效。所有标准库容器都定义"=="和"!=",而不是"<"。
迭代器运算
运算 | 含义 |
---|---|
iter + n | 前移n个位置 |
iter - n | 后移n个位置 |
iter += n | 前移n个位置,赋值iter |
iter -= n | 后移n个位置,赋值iter |
iter1 - iter2 | 距离 |
< > >= <= | 位置关系 |
注意:n为unsigned int 或者int,不影响计算。
auto mi = vi.begin() + vi.size() / 2 //计算中间的迭代器
来个binary_search()
auto beg = text.begin(),end = text.end();
auto mid = text.begin() + (end -beg) >> 1;
while(mid != end && *mid! = target)
{
if(target < *mid)
end = mid;
else
beg= mid+1;
mid = beg + (end - beg)/2;
}