C++ primer 学习笔记——迭代器

迭代器与指针类似
只有string和vector等一些标准库类型有下标运算符
所以使用迭代器也能访问string对象字符和vector对象的元素
使用迭代器

auto b=v.begin,e=v.end();//end成员负责返回容器(或string)  尾元素的下一个位置 的迭代器,称为 尾后迭代器
int arr[5]={0,1,2,3,4};
vector<int> vec(begin(arr),end(arr));//数组初始化vector

迭代器与运算符
*it

#include<iostream>
#include<string>
using std::string;
using std::cout;
int main()
{
    string s("hello word");
    if (s.begin() != s.end())
    {
        auto it = s.begin();
        *it = toupper(*it);//*it返回迭代器it所指向的元素的引用
    }
    cout << s;
    return 0;
}

it++

#include<iostream>
#include<string>
using std::string;
using std::cout;
int main()
{
    string s("hello word");
    for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it)//++it 使迭代器移动到下一个字符
    //习惯使用 != 。所以标准迭代器都定义了!=而不是<
        *it = toupper(*it);
    cout << s;
    return 0;
}

(*it).num 和it->num 意思相同//解引用
解引用迭代器可获得迭代器所指向的对象,如果对象类型为类,有可能希望进一步访问其成员

//3.22对每个字符改成大写
#include<iostream>
#include<vector>
#include<string>
using std::string;
using std::vector;
using std::cout;
using std::endl;
int main()
{
    vector<string> v{ "hi", "i", "am", "amy" };
    for (auto it = v.begin();it != v.end(); ++it)
    {
        for (auto &s1 = it->begin();s1 != it->end(); s1++)
        //s1为string的迭代器,使用引用来改变字符串字符
        {
            *s1 = toupper(*s1);
        }

    }
    for (auto c : v)
        cout << c << " ";

    return 0;
}

迭代器类型

vector<int>::iterator it;
string::iterator it2;

vector<int>::const_interator it3;
string::const_interator it4;

每个容器类定义一个名为interator的类型,该类型支持迭代器类型的一系列操作

end与begin运算符的返回值

vector<int> v;
auto it1=v.begin();//auto 为 vector<int>::interator

使用迭代器运算——二分搜索

#include<iostream>
#include<vector>
using std::vector;
using std::cout;
using std::endl;
int main()
{
    vector < int > num{0,1,2,3,4,5,6,7,8,9 };
    int sought;
    std::cin >> sought;
    auto begin = num.begin();
    auto end = num.end();
    auto mid = num.begin() + (end-begin) / 2;
    while (mid != end && *mid != sought)
    {
        if (*mid < sought)
            begin = mid+1;
        else
            end = mid ;
        mid = begin+(end - begin) / 2;//新的中点
        //mid = (begin + end) / 2;
/*Error 1   error C2678: binary '+' : no operator found which takes a left-hand operand of type 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>' (or there is no acceptable conversion)   h:\c++\project\11.5\11.5\erfensousuo.cpp    21  1   11.5*/
//+重载运算符的左右操作数类型不符合

    }
    cout << *mid;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值