C++Primer第五版 3.4.2节练习

本文通过几个具体的编程练习,深入探讨了迭代器在C++中的应用,包括如何使用迭代器进行相邻元素相加、对称元素求和及分数段划分计数等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习3.24:请使用迭代器重做3.3.3节(第94页)的最后一个练习。
练习3.25:3.3.3节(第93页)划分分数段的程序是使用下标运算符实现的,请利用迭代器改写程序并实现完全相同的功能。
练习3.26: 在100页的二分搜索中,为什么用的是mid = beg + (end - beg)/2,而非mid = (beg+end)/2;

答:练习3.24,3.25见云盘程序。
练习3.26,答:在日常生活中,我们习惯了以原点或者说是零点为参考点进行坐标的计算,在一维图中,即线段中,我们习惯把最左边的位置看成零点,但实际,假设我们在一个线段中标定,左右节点的位置,那我们对该段线段计算时就应该把左边的节点看成参考点,这才符合更一般的情况,beg是左侧参考点(相当于零点),end-beg是线段长度,因此mid= beg +(end - beg);

练习3.24-1

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int val;
    vector<int> ivec;
    while (cin >> val)
        ivec.push_back(val);

    for (auto it = ivec.begin(); it != ivec.end()-1; ++it) 
    //第一个实现相邻数字的相加 
        {
            auto sum = *it + *(it + 1);
            cout << sum << " "; 
        }
        cout << endl;

    return 0;
} 

练习3.24-2

/*
*
*2015/5/21 重新把练习3-24第二个小题做了 
*想清楚迭代器的结构,就不难了 
*/ 
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int val;
    vector<int> ivec;
    vector<int> ivec2;
    while (cin >> val)
        ivec.push_back(val);

    /*for (auto it = ivec.begin(); it != ivec.end(); ++it)
    {

    }*/

    auto a = ivec.begin();
    auto e = ivec.end()-1; //尾迭代器里面啥也没有,它的前一位是放的最后一个数 
    auto mid = a + (e-a)/2; //划定了中间的位置 
    while (a <= mid && e >= mid  ) //在中间位置相遇时,迭代器停止运算。 
    {
        auto sum = *a + *e;
        ivec2.push_back(sum);  //用新的迭代器来保存这个和 
        ++a;
        --e;
    }
    //ivec2.push_back(2*(*mid));

    for (auto it = ivec2.begin(); it != ivec2.end(); ++it) //输出这个结果 
        cout << *it << " ";
        cout << endl;

    return 0;
}
/*
*
2015/5/21 
练习3.25 
*/ 
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    unsigned scores;
    vector<unsigned> scoresTotal;
    while (cin >> scores)
    {
        if (scores <= 100)
        scoresTotal.push_back(scores);
    }

    vector<unsigned> grade(11,0);//grade里初始化11个数 
    auto it2 = grade.begin(); 

    for (auto it = scoresTotal.begin(); it != scoresTotal.end(); ++it)
        {
             //auto n = *it /10; //对应的编号就是迭代器需要更新的位置,和下标运算等价。 
             //++*(it2+n); //在外部定义一个迭代器就行,改变的地方和标号对应就行,不要在里面写循环,那是错的,迭代器的位置更灵活,循环就限死了。 
             ++*(it2 + (*it)/10); //合起来写,建议采用上面写法,便于理解和阅读 
        }

    for (auto it = grade.begin(); it != grade.end(); ++it)
        cout << *it <<" ";
        cout << endl;   
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值