迭代器基本

begin()首迭代器,end()尾迭代器。对begin()解引用指向首元素的引用,end()解引用指向尾元素的下一个位置(不存在的地方)。

如果首位迭代器相等,则代表容器为空。对于迭代器,都有==的!=但是不一定有<,>,所有要避免使用大小于。

下面将首单次大写

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string str = "Lolita is a beautiful girl";

    if(str.begin() != str.end()) //确保string非空
    {
        for(auto it = str.begin();it!=str.end()&&!isspace(*it);++it)
        {
            if(islower(*it))
                *it = toupper(*it);
        }
    }

    std::cout<<str<<std::endl;
}

 迭代器类型

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> strVec ;
    strVec.push_back("C++");
    strVec.push_back("是中国的");
    strVec.push_back("");
    strVec.push_back("不是日本的");

    for(auto it=strVec.cbegin();it!=strVec.cend()&&!it->empty();++it)
    {
        std::cout<<*it;
    }
    std::cout<<std::endl;
}

//std::vector<std::string>::iterator it ; //使用begin()获得
//std::vector<std::string>::const_iterator it ;//使用cbegin()获得

迭代器副作用

但凡使用了迭代器的循环体,都不要向迭代器所属容器添加元素,否则会使迭代器失效;

 

string和vector提供了更多的迭代器运算

两个迭代器相减得到的是一个有符号类型的数

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> strVec ;
    strVec.push_back("C++");
    strVec.push_back("是中国的");
    strVec.push_back("");
    strVec.push_back("不是日本的");

    std::cout<<strVec.cbegin()-strVec.cend()<<std::endl;
    std::cout<<strVec.cend()-strVec.cbegin()<<std::endl;
}

二分法查找

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::vector<unsigned> intVec ;
    for(unsigned i=0;i<100;i++)
    {
        intVec.push_back(i);
    }

    auto begin = intVec.cbegin();
    auto end = intVec.cend();
    auto mid = begin + (end-begin)/2 ;

    unsigned su = 78 ;
    while(mid != end && *mid != su)
    {
        if(su < *mid)
            end = mid ;
        else
            begin = mid+1 ;

        mid = begin + (end-begin)/2 ;
    }
    if(mid != end)
    {
        std::cout<<"已经找到"<<std::endl ;
        std::cout<<*mid<<std::endl;
    }
}

时间: 2024-11-09 21:19:29

迭代器基本的相关文章

Day4 - 迭代器&amp;生成器、装饰器、Json &amp; pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

装饰器、生成器、迭代器

装饰器的前奏 装饰器:本质是函数 功能:就是装饰成其他函数  就是为其他函数添加附加功能的 高阶函数+嵌套函数=装饰器 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 总结一句话:装饰器对被装饰的函数是完全透明的 实现装饰器的只是储备: 1.函数名即"变量"   将函数体赋值给变量   和内存回收机制一样 2.高阶函数 2.1.把函数名作为实参传递给形参(可返回被修饰函数的地址)(不修改源代码的情况可添加新的功能) 2.2返回值中包含函数地址(不修改函数的调

Vector容器 和 iteration 迭代器

vector容器 vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库负责管理存储元素的相关内存.我们把vector称为容器,是因为它可以包含其他对象.一个容器中的所有对象都必须是同一种类型的. 使用vector之前,必须包含相应的头文件.#include <vector> using std::vector; vector是一个类模板(class template).模板允许程序员编写单个类或函数定义,这个类和函数定义可用于不同的数据类型上.

Python高级特性:迭代器和生成器 -转

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

迭代器

创建迭代器最常用的方法是对IEnumerator接口实现GetEnumerator方法. public class Family : System.Collections.IEnumerable { string[] myFamily = {“父亲”,”母亲”,”弟弟”,”妹妹”}; public System.Collections.IEnumerator GetEnumerator() { for(int i=0;i<myFamily.Length;i++) { yield return m

LeetCode OJ:Peeking Iterator(peeking 迭代器)

Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be returned by the next call to next(). Here is an exampl

JavaScript设计模式 - 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 许多浏览器都支持 Javascript 的 Array.prototype.forEach 迭代器可以分为 内部迭代器 和 外部迭代器 一.jQuery 中的迭代器 1 $.each( [1,2,3,4], function (i, n) { 2 console.log( "当

Java基础知识强化之集合框架笔记11:Collection集合之迭代器的原理及源码解析

1. 迭代器为什么不定义成一个类,而是定义为一个接口 ?  答:假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历.但是呢? 我们想想,Java中提供了很多的集合类,而这些集合类的数据结构是不同的,所以,存储的方式和遍历的方式应该是不同的.进而它们的遍历方式也应该不是一样的,最终,就没有定义迭代器类.        而无论你是哪种集合,你都应该具备获取元素的操作,而且,最好在辅助于判断功能,这样,在获取前,先判断.这样的话就不容易出错.也就是说,判断功能和获取