c/c++ 标准库 迭代器(iterator)
c/c++ 标准库 迭代器
begin和end运算符返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator;如果对象不是常量,返回iteraotor
### 1,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。
2,不能在范围for循环中向vector对象添加元素
标准库 迭代器(iterator)的小例子
test1~test8
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
  //test1
  /*
  string s("abc bdc");
  auto it = s.begin();
  while(it != s.end()){
    *it = toupper(*it);
    ++it;
  }
  cout << s << endl;
  */
  //test2
  /*
  string s("abd ddd");
  for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it){
    *it = toupper(*it);
  }
  cout << s << endl;
  */
  //test3 不可改变vector::const_iterator类型
  /*
  vector<int>:: iterator it;
  vector<int>:: const_iterator it2;
  vector<int> v(5,1);
  it = v.begin();
  it2 = v.begin();
  vector<int> const cv(5,2);
  //it = cv.begin();//it是可改变的vector::iterator,所以编译错误
  for(auto s : v){
    cout << s;
  }
  cout << endl;
  */
  //test4 不可改变string::const_iterator类型
  /*
  string::iterator sit;
  string::const_iterator sit2;
  string s1("abc");
  sit2 = s1.begin();
  while(sit2 != s1.end()){
    //*sit2 = toupper(*sit2);
    cout << *sit2;
    ++sit2;
  }
  cout << endl;
  */
  //test5 cbegin和cend,返回const类型的iterator
  /*
  string s1("aaaa");
  auto it1 = s1.cbegin();
  //*it1 = 'c';//不可以通过const类型的iterator改变原来的对象
  cout << s1 << endl;                                                           
  vector<int> v(4,2);
  auto vit1 = v.cbegin();
  //*vit1 = 5;//不可以通过const类型的iterator改变原来的对象
  */
  //test6 string迭代器运算
  /*
  string s("abcd");
  string s1("abc");
  vector<int> v(5,3);
  auto it1 = s.begin();
  auto it2 = s.begin();
  if(it1 == it2){
    cout << "=" << endl;
  }
  ++it1;
  it1 += 1;
  if(it1 > it2){
    cout << ">" << endl;
    cout << it1 - it2 << endl;
  }
  string::difference_type juli = it1 - it2;
  cout << juli << endl;
  */
  //test7 vector迭代器运算
  /*
  vector<string> s(4,"abcd");
  vector<string> s1(5,"abc");
  auto it1 = s.begin();
  auto it2 = s.begin();
  if(it1 == it2){
    cout << "=" << endl;
  }                                                                             
  ++it1;
  it1 += 1;
  if(it1 > it2){
    cout << ">" << endl;
    cout << it1 - it2 << endl;
  }
  vector<string>::difference_type juli = it1 - it2;
  cout << juli << endl;
  */
  //test8 利用迭代器实现二分法
  vector<string> v{"a","b","c","d","e"};
  string target("b");
  vector<string>::size_type idx = 0;
  auto beg = v.begin();
  auto mid = v.begin() + v.size() / 2;
  auto end = v.end();
  while(mid != end && *mid != target){
    if(target < *mid)
      end = mid;
    else
      beg = mid + 1;
    mid = beg + (end - beg) / 2;
  }
  if(mid == end){
    cout << "not found" << endl;
  }
  else{
    idx = mid - v.begin();
    cout << idx << ":" << *mid << endl;
  }
}
c/c++ 标准库 迭代器(iterator)的更多相关文章
- STL标准库-迭代器适配器
		技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 这次主要介绍一下迭代器适配器.以reverse_iterator(反向迭代器),insert_iterator(插入迭代器),o ... 
- STL标准库-迭代器
		技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 本节主要介绍STL六大部件中的Iterators迭代器. 在语言方面讲,容器是一个class template, 算法是一个仿函 ... 
- PHP SPL标准库-迭代器
		通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器. PHP中迭代器是通过Iterator 接口定义的. ArrayIterator迭代器 foreach ... 
- C++ Primer 第三章 标准库类型vector+迭代器iterator 运算
		1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ... 
- C++标准库类型vector及迭代器iterator简介
		Vector是C++标准库类型,称为容器,一个容器中的所有对象必须是同一种类型的.与数组相比,其最大的优点就是动态增长.Vector是一个类模板,并不是数据类型,而vector<int>和 ... 
- 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)
		督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ... 
- C++ Primer 有感(标准库vector及迭代器)
		vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ... 
- C++标准库vector以及迭代器
		今天看C++的书,出现了一个新的概念,容器vector以及容器迭代器. vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存. ... 
- C++标准库vector及迭代器
		vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ... 
随机推荐
- SharePoint如何配置Ipad跳转等问题
			如何配置Ipad跳转 Apple iPad 设备上不支持 SharePoint 标准视图.用户可以改用移动视图在 iPad 设备上查看 SharePoint 内容.默认情况下,iPad 用户被重定向到 ... 
- Http系列目录
			1.Http简史 2.Http协议基本术语 3.Http1.1 4.Http2.0 
- Jenkins入门之执行Powershell脚本
			之前章节提到过powershell,如果需要构建复杂的任务时,使用cmd不是很方便(也可能是由于笔者不太熟悉cmd命令,这里见笑了),这时候powershell就派上用场了,这里并不详细介绍power ... 
- centos7部署DNS-1
			文章索引: 一.服务相关介绍 二.实验:搭建正向主DNS服务器 三.实验:搭建反向解析服务器 四.实验:泛域名解析,如wwww.baidu.com也可以正常访问 环境 服务器 节点名称 IP地址 dn ... 
- SpringBoot学习(七)-->SpringBoot在web开发中的配置
			SpringBoot在web开发中的配置 Web开发的自动配置类:在Maven Dependencies-->spring-boot-1.5.2.RELEASE.jar-->org.spr ... 
- 把mysql脚本或其他数据库脚本导入Powerdesigner
			打开powerdesigner,选择File --> Reverse Engineer --> Database…… Model name是模型名称,DBMS选MySQL 5.0 然后确定 ... 
- mysql+高可用MMM
			一. MMM 简介:MMM 即 Multi-Master Replication Manager for MySQL:mysql 多主复制管理器,基于 perl 实现,关于 mysql 主主复制配置的 ... 
- 从零开始学安全(二十二)●PHP日期date参数表
			$date=new DateTime(); echo $date->format("Y-m-d h:i:s"); 
- ubuntu16.4系统和Gentos6.8系统查看开机自启动服务
			ubuntu16.4系统查看自启服务: 需要自行安装一个sysv-rc-conf的工具来查看: sudo apt-get install sysv-rc-conf 查看自启命令: sudo sysv- ... 
- Netty 系列七(那些开箱即用的 ChannelHandler).
			一.前言 Netty 为许多通用协议提供了编解码器和处理器,几乎可以开箱即用, 这减少了你在那些相当繁琐的事务上本来会花费的时间与精力.另外,这篇文章中,就不涉及 Netty 对 WebSocket协 ... 
