3.4 迭代器iterator - C++ primer 笔记

迭代器

在STL的容器中,其中string和vector可以用下标来访问元素,有些不行。
使用迭代器访问STL容器元素是一种通用的方式。

auto b = v.begin();	//begin成员负责返回 指向第一个元素的迭代器
auto b = v.begin();	//end成员负责返回 指向“尾元素的下一个位置”的迭代器

若容器为空,begin和end返回的是同一个迭代器,即尾迭代器

迭代器运算符

与指针类似

*iter				//返回迭代器iter所指元素的 引用
iter->mem			//解引用iter 并获取mem成员
++iter				//令iter指向容器的 下一个容器
--iter				//
iter1 == iter2		//指向同一个元素或者都是 尾迭代器,则相等
iter1 != iter2		//反之,不相等

使用迭代器时,使用==和!=,不要使用<,因为STL容器的迭代器都定义了 ==和!=,而<大多没有定义。

迭代器类型

iterator的对象可读可写;
const_iterator的对象可读不可写。
使用auto,如果容器对象是常量,begin和end返回const_iterator;如果不是常量,返回iterator。
使用auto,cbegin和cend 默认返回const_iterator。
使用迭代器的循环体,不要向迭代器所属容器添加元素

string和vector的迭代器

iter +n 	//返回新迭代器,指向的新位置相比原来 **向后**移动了若干元素。
iter -n		//返回新迭代器,指向的新位置相比原来 **向前**移动了若干元素。
iter1 +=n	//
iter1 -=n	//
iter1 -iter2//迭代器相减得到 它们之间的距离n。iter1移动n距离即可到iter2
> >= < <=	//迭代器指向元素 在容器中的位置决定大小,第二个元素大于第一个元素。

验证一下前后的问题,按习惯说,下标小为前,看原文看蒙了。
iter加了n,应该是往后移了n吧!!!
在这里插入图片描述
看下面的代码,begin指向第一个元素1,end指向最后一个元素10的下一个元素,发现it1 < it2为真。

    vector<int> vi{ 1,2,3,4,5,6,7,8,9,10 };
    auto it1 = vi.begin(), it2 = vi.end();
    cout << "it1 < it2 : "<<(it1 < it2) << endl;//结果为真
    cout << "*(it1 + 3): " << *(it1 + 3) << endl;//结果为4,(元素1往后移动3,到元素4的位置)
    cout << "(it1 + 11)==it2: " << ((it1 + 10)==it2 )<< endl;//true。
    cout << "(it1 + 11)==it2: " << ((it1 + 11)==it2 )<< endl;//越界报错。

在这里插入图片描述

使用迭代器实现二分搜索

//text必须是有序的
vector<string> text{"asd", "bkg", "cpu", "hd"};
string sought("cpu");
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end-beg)/2;
while(mid != end && *mid != sought){
	if(*mid < sought)
		beg = mid +1;
	else
		end = mid;
	mid = beg + (end-beg)/2;

习题

3.22 将string对象中中的单词改成大写,输出

string s = "hello world";
for (auto it = s.begin(); it != s.end()&& !isspace(*it); ++it)
	*it = toupper(*it);
	cout<<*it<<endl;

3.23 创建包含十个整数的vector对象,使用迭代器将元素变成两倍,输出

vector<int> vi{1,2,3,4,5,6,7,8,9,10};
for(auto it= vi.begin();it != vi.end(); ++it){
	*it *=2;
	cout<<*it<<endl;
}

3.24 将3.20重写

void q3_24() {
    int s;
    char c1;
    vector<int> v;
    //while ((cin >> s).get(c1)) {
    //    v.push_back(s);
    //    if (c1 == '\n')
    //        break;
    //}
    for (unsigned i = 0; i != 10; i++)
    {
        cin >> s;
        v.push_back(s);          //创建含有10个整数的vector对象
    }
    size_t size = v.size();
    for (auto beg = v.begin(); beg != v.end() - 1; ++beg) {
        cout << *beg + *(beg + 1) << " ";
    }
    cout << endl;
    for (auto i = v.begin(), j = v.end(); i != v.begin()+ (v.end()-v.begin()) / 2; ++i) {
        --j;
        cout << *i + *j << " ";
    }
}

在这里插入图片描述
3.25
以十分为一个分数段统计成绩的数量

void q3_25() {
    vector<unsigned> scores(11, 0);
    unsigned grade;
    char c1;
    auto it = scores.begin();
    while ((cin >> grade).get(c1)) {
        if (grade <= 100)
            ++(*(it + (grade / 10)));
        if (c1 == '\n')
             break;  
    }
}

3.26
mid = beg+ (end- beg) /2
mid = (beg + end) /2 //报错,没有与之匹配的“+”运算符。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值