c++ primer第五版(中文)习题答案 第十章第二节第二小节-写容器元素的算法

本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。

本节初步了解泛型算法。

算法不能改变容器大小,切记

10.6编写程序,使用fill_n将一个序列中的int值都设置0
代码如下

#include <vector>
#include <string>
#include "stdlib.h"
#include <iostream>
int main()
{
    std::vector<int> vec;//空容器
    int i = 0;
    while (std::cin >> i)
        vec.push_back(i);

    std::fill_n(vec.begin(), vec.size(), 0);

    for (auto s:vec) //使用c++11新特性循环
        std::cout << s;

    system("pause");
    return 0;
}

输出结果为
这里写图片描述

10.7是否有错

#include <vector>
#include <string>
#include <list>
#include "stdlib.h"
#include <iostream>

int main7_1()
{
    //注意修改函数名为主函数名main
    std::vector<int>vec;//空容器 
    std::list<int>lst;
    int i;
    while (std::cin >> i)
        lst.push_back(i);
    /************************************************************************/

    //改正 保证目标容器vec.size()>=lst.size()

    //1.
    for (int k = 0; k < lst.size() ;k++)
    vec.push_back(k);

    //2.
    std::fill_n(back_inserter(vec), lst.size(), 0);

    //3.
    vec.resize(lst.size());

    //以上三种方式都可以做到vec.size()==lst.size();

    /************************************************************************/

    std::copy(lst.cbegin(), lst.cend(), vec.begin());
    for (auto s : vec)
    {
        std::cout << s;
    }
    system("pause");
    return 0;

}
int main7_2()
{
    std::vector<int>vec;//空容器 
    vec.reserve(10);//该函数是 容器预留空间,但并不真正创建元素对象,所以该对象值还是为0

    /************************************************************************/
    int k = vec.size();//值还是为0,
    vec.resize(10); //resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了
    int k2 = vec.size();//值为10
    /************************************************************************/

    std::fill_n(vec.begin(), 10, 0);

    for (auto s : vec)
        std::cout << s;


    system("pause");
    return 0;

}

10.8本节提到,标准算法不会改变他们所操作的容器大小,为什么使用back_inserter不会使这一断言失效。

#include <vector>
#include <string>
#include <list>
#include "stdlib.h"
#include <iostream>
#include <iterator>
int main()
{
    //算法不会改变他们所操作的容器大小,为什么使用back_inserter不会使这一断言失效

    std::vector<int>vec;//空容器
    auto it = back_inserter(vec);//通过它赋值会将元素添加到vec中
    *it = 42;//vec中现在有一个元素,值为42


    //back_inserter一个成员函数,返回值是back_insert_iterator, 本质上是push_back进行操作的, 
    //返回值back_insert_iterator, 并实现其自增.
    fill_n(back_inserter(vec), 10, 0);

    for (auto s : vec)
        std::cout << s;

    system("pause");
    return 0;
}

在使用标准库算法的时候要记住 ,算法不能改变其操作容器的大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值