C/C++教程

2021-07-26c++primer 第10章的习题

本文主要是介绍2021-07-26c++primer 第10章的习题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

10.1

#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
using namespace std;
int main(int argc,const char*argv[]){
    /*ifstream in(argv[1]);
    if(!in){
        cout << "打开输入文件失败" << endl;
        exit(1);
    }*/ //这一段的含义完全没有看懂
    vector<int> nums;
    int number;
    while (cin >> number)
    {
        nums.push_back(number);
    }
    cout << count(nums.begin(),nums.end(),4) << endl;
    return 0;
}

困惑:
这一段程序的含义没有看懂

ifstream in(argv[1]);
    if(!in){
        cout << "打开输入文件失败" << endl;
        exit(1);
    }

10.5

#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
#include<string>
#include<list>
#include<numeric>
#include<string.h>
using namespace std;
int main(void){
    char *p[] = {"Hello","World","!"};
    char *q[] = {strdup(p[0]),strdup(p[1]),strdup(p[2])};
    //strdup()为字符串拷贝函数,为复制的字符串分配空间,返回分配空间后的指针
    //不再使用该空间之后,要使用函数free()释放分配的内存
    char *r[] = {p[0],p[1],p[2]};
    cout << equal(begin(p),end(p),q) << endl;
    cout << equal(begin(p),end(p),r) << endl;
    //begin()返回的是数组首元素指针,end()返回的是数组尾部元素的指针
    return 0;
}

10.27

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
int main(void){
    vector<int> nums;
    int number;
    while (cin >> number)
    {
        nums.push_back(number);
    }
    sort(nums.begin(),nums.end());
    // int size = nums.size();
    //list<int> lt(size);
    // unique_copy(nums.begin(),nums.end(),lt.begin);
    //纠结了好久不知道该如何确定lt容器的大小
    list<int> lt;
    unique_copy(nums.begin(),nums.end(),back_inserter(lt));
    for(auto v : lt){
        cout << v << " ";
    }
    cout << endl;
    return 0;
}

begin()、end()之类的迭代器指明了元素的位置,不能够是实现插入,back_inserter()之类的函数既能够指明位置又能够实现插入。

10.28

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
int main(void){
    vector<int> nums = {1,2,3,4,5,6,7,8,9};
    list<int> lt1,lt2,lt3;
    copy(nums.begin(),nums.end(),front_inserter(lt1));
    copy(nums.begin(),nums.end(),back_inserter(lt2));
    copy(nums.begin(),nums.end(),inserter(lt3,lt3.begin()));
    for(auto it1 = lt1.begin();it1 != lt1.end();it1++){
        cout << *it1;
    }
    cout << endl;

    for(auto it2 = lt2.begin();it2 != lt2.end();it2++){
        cout << *it2;
    }
    cout << endl;

    for(auto it3 = lt3.begin();it3 != lt3.end();it3++){
        cout << *it3;
    }
    cout << endl;
    return 0;
}

在这里插入图片描述

front_iterator ()向容器中添加元素是倒着添加的。

10.34

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
int main(void){
    vector<int> nums = {1,2,3,4,5,6,7,8,9};
    // vector<int>::reverse_iterator it;
    for(auto it = nums.rbegin();it != nums.rend();it++){
        cout << *it;
    }
    cout << endl;
}

10.35

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
int main(void){
    vector<int> nums = {1,2,3,4,5,6,7,8,9};
    // vector<int>::reverse_iterator it;
    for(auto it = nums.end()-1;it != nums.begin()-1;it--){
        cout << *it;
    }
    cout << endl;
    //答案的做法
    for(auto r_it = nums.end();r_it != nums.begin();){
        cout << *(--r_it);
        //先减小后输出
    }
    cout << endl;
}

10.36

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
int main(void){
    list<int> nums = {1,2,0,4,5,0,7,0,9};
    auto last_z = find(nums.rbegin(),nums.rend(),0);
    //如何知道反向迭代器指向的是第几个
    last_z++;//保证使用正向迭代器的时候,能够指向最后一个0
    //int p = 0;这个的初始化不对,移动的次数会比所有的元素的个数少一
    int p = 1;
    for(auto it = nums.begin();it != last_z.base();it++){
        p++;
    }
    if(p >= nums.size())
    cout << "不存在0" << endl;
    else cout << "the position of last zore is " << p << endl;
    return 0;
}

10.37

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
int main(void){
    ostream_iterator<int> out_iter(cout," ");
    //don't understand
    vector<int> vi = {0,1,2,3,4,5,6,7,8,9};
    copy(vi.begin(),vi.end(),out_iter);
    cout << endl;
    list<int> li;
    vector<int>::reverse_iterator re(vi.begin()+2);
    //using iterator to initialize reverse iterator
    vector<int>::reverse_iterator rb(vi.begin()+7);
    copy(rb,re,back_inserter(li));
    copy(li.begin(),li.end(),out_iter);
    cout << endl;
    return 0;
}
/*int main(void){
    vector<int> nums = {1,2,3,4,5,6,7,8,9,10};
    list<int> lt;
    copy(nums.rbegin()+3,nums.rbegin()+8,back_inserter(lt));
    //拷贝数字【3,7】,由于copy为左开右闭区间,应该加上的数字为8
    for(auto it = lt.begin();it != lt.end();it++){
        cout << *it;
    }
    cout << endl;
    return 0;
}*/

1)ostream_iterator (os,str)
将T类型的元素输出到输出流中,每个元素后面追加一个C元素风格的字符串,
2)可以用正向迭代器初始化反向迭代器,其效果等同于将迭代器所指向的位置向前移动一位

10.38
列出五个迭代器的类别,以及每个迭代器所支持的操作。

1、输入迭代器——用于读取迭代器所指向的元素的内容
1)能够进行迭代器之间的比较。(用于确定输入和输出的范围)
2)能够进行解引用,通过指针获取元素具体的内容
3)能够通过递增和递减元素进行位置的移动
(确定范围,移动位置,解引用获取具体的内容)

2、输出迭代器——用于向容器内写入指定元素
1)能够通过递增和递减来进行定位,确定输入元素的位置
2)解引用运算符,指定其输入的位置

3、向前迭代器——支持单向扫描元素(如果从后向前也算是单向迭代器吗?
1)输入和输出的迭代器的操作都支持
2)只能单向读写元素

4、双向迭代器——能够双向读写元素
1)除了forward_list,其他容器都支持双向迭代器

5、随机访问迭代器——随机读写元素
1)具有能够比较两个迭代器关系的比较操作符
2)迭代器能够与数字相加减
3)迭代器之间能够相减得到相对的距离
4)具有下标运算符
在这里插入图片描述
不明白

这篇关于2021-07-26c++primer 第10章的习题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!