迭代器基本

断了今生、忘了曾经 提交于 2020-03-04 05:25:51

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;
    }
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!