c++第七、八、九章

目录

第七章

单项选择题:

第八章

判断题:

单项选择题:

函数题:

第九章

单项选择题:


第七章

单项选择题:

1.下列的模板说明中,正确的是:

A.template < typename T1, T2 >; B.template < class T1, T2 >; C.template < typename T1, typename T2 >; D.template ( typedef T1, typedef T2 )

//注意使用逗号隔开,每个参数前面都要加typename或class,在函数模板这里,class不是指类,其作用与typename相同(建议使用typename),typedef相当于重留名c++踩坑大法好 typedef和模板 - 0点0度 - 博客园 (cnblogs.com)

4.下列选项中,哪一个函数可以定义为对许多数据类型完成同一任务____。

A.函数模板;     B.递归函数;      C.模板函数;      D.重载函数

在运用的时候,可以显式(explicitly)生产模板函数,fun<int>、fun<double>、fun<Shape*>……。  

  也可以在使用的过程中由编译器进行模板参数推导,帮你隐式(implicitly)生成。  

  fun(6);//隐式生成fun<int>  

  fun(8.9);//隐式生成fun<double>  

  fun(‘a’);//   隐式生成fun<char>  

  Shape*   ps   =   new   Cirlcle;  

  fun(ps);//隐式生成fun<Shape*>  

  模板函数的重点是函数。表示的是由一个模板生成而来的函数。例子:  

  上面显式(explicitly)或者隐式(implicitly)生成的fun<int>、fun<Shape*>……都是模板函数。  

模板类与类模板、函数模板与模板函数等的区别 - wangduo - 博客园

5.关于类模板,描述错误的是。

A.一个普通基类不能派生类模板;      B.类模板可以从普通类派生,也可以从类模板派生;      C.根据建立对象时的实际数据类型,编译器把类模板实例化为模板类;      D.函数的类模板参数需生成模板类并通过构造函数实例化

第七章问题:

1.有一个原则是不能违背的,就是不能使用T去做它没有定义的工作,例如:

template<typename T>
T* Test<T>::createInsideObj()
{
    return new T();
}

我们这里给出了createInsideObj的实现,这个例子没有任何实质意义只为说明语法,在定义中使用new T()来创建一个对象,那么仔细观察会发现,该定义要求T类型一定要有一个public的无参构造函数,例如我们使用Test<int>来实例化该类模板C++ 模板学习总结(三)模板参数的三种形式

第八章

判断题:

7.set/multiset的区别是set用来存储一组无重复的元素,而multiset允许存储有重复的元素。T

   返回值型别不同的原因是set不允许元素重复,而multiset允许。当插入的元素在set中已经包含有同样值的元素时,插入就会失败。所以set的返回值型别是由pair组织起来的两个值:第一个元素返回新元素的位置,或返回现存的同值元素的位置。第二个元素表示插入是否成功。multiset不会检测数据,因此可以插入重复数据

9.迭代器是对象,它的作用类似于指向元素的指针。T

单项选择题:

3有关STL容器的说法不正确的是( )。

A.序列式容器中的数据的顺序与数据的操作顺序相关,而关联式容器中的数据的顺序由数据的关键字大小决定,与数据的操作顺序无关。     

B.如果需要执行大量的随机访问操作,就应当选择向量容器;如果需要执行大量的随机插入或删除元素操作,就应当选择列表容器。//at,[];list不能随机访问     

C.关联型容器内部结构实现为一个二叉树,它可以高效地查找容器中的每一个元素,能够实现任意位置的操作。     

D.集合中的元素不可能直接被修改,若要修改某一元素的值,必须先删除原有的元素,再插入新的元素。

关联型容器分为有序关联性容器和无序关联型容器;有序关联性容器内部实现平衡二叉树,实现平衡二叉树支持高效的按键查找和访问元素的方法,但不能实现任意位置操作;无序关联型容器内部实现的是哈希表,旨在提高添加和删除元素的速度及提高查找算法的效率textbook

5.已知双端队列d的初始值为0,1,2,3,4。执行下列代码的输出结果是( )。

d.push_front(11);
d.insert(d.begin() + 2,22);
d.pop_back();
d.erase(d.begin() + 3);
for (int i = 0; i < d.size(); i++)
  cout << d.at(i) << " ";

A.0 1 2 3 4;      B.11 0 1 2 3;      C.11 0 22 2 3;      D.11 0 22 1 2

7.设有如下代码段:

using namespace std;
map<char *, int> m;
const int MAX_SIZE = 100;
int main() 
{
    char str[MAX_SIZE];
    for (int i = 0; i < 10; i++)
    {
        cin >> str;
        m[str] = i;
    }
    cout << m.size() << endl;
}

读入10个字符串,则输出的 m.size() 为:      A.0;      B.1;      C.10;  

m[str]=i ;不是m[i]=str;

8.下列关于STL的描述中,错误的是()。

A.STL的内容从广义上讲分为容器、迭代器、算法三个主要部分;      B.STL的一个基本理念就是将数据和操作分离;      C.STL中的所有组件都由模板构成,其元素可以是任意类型;      D.STL的容器、迭代器、算法是三个完全独立的部分,彼此也无任何联系

11.以下哪个函数不属于 STL中的算法()?

A.for_each();      B.insert();      C.find();      D.sort()

14有代码如下:

string s;

s[0]='1';

则关于以上语句说法正确的是( )。

A.语句"s[0]='1';" 有问题;      B.s的值为字符串"1";      C.s是空格串;      D.s是空串

函数题:

6-1 筛法求质数 作者 李廷元 单位 中国民用航空飞行学院

本题要求使用筛法求出1~N以内的质数。

函数接口定义:

vector<int> sieve(int n); //函数声明, 求n以内的质数

n以内的质数。其中 n是传入的参数。n 的值不超过10 000 000的范围; 求出的质数存入容器vector并返回。

裁判测试程序样例:

#include <iostream>

#include <vector>

using namespace std;

vector<int> sieve(int n); //函数声明,求n以内的质数

int main(int argc, char const *argv[])

{

 int n;

 cin >> n;

 vector<int> ans = sieve(n);

 cout << ans.size() << endl;

 for (int i=0; i<ans.size(); i++)

 {

   cout << ans[i];

   if (i < ans.size() - 1)cout << " ";

  }

 cout << endl; return 0;

}

/* 请在这里填写答案 */

输入样例:

输入在一行中给出一个正整数N,其值不超过10 000 000。

10

输出样例:

输出首先在一行中输出指定范围内的质数个数,然后在另一行输出指定范围内的所有质数,以空格分隔,但是最后一个质数后面没有多余空格。

4

2 3 5 7

代码长度限制:16 KB

时间限制:400 ms

内存限制:64 MB

第一次错误尝试:

vector<int> sieve(int n) //函数声明, 求n以内的质数
{
    vector<int> num;
    int a[10000002]={0};
    for(int i=2;i*i<=n;i++)
    {
        if(a[i]==1) continue;
        int temp=2;
        while(temp*i<=n)
        {
            a[temp*i]=1;
            temp++;
        }
    }
    for(int i=2;i<=n;i++)
    {
        if(a[i]!=1) temp.push_back(i);
    }
    return temp;
}

程序可以正常运行,但显示

 错误原因是因为:

 修改后:

 正确答案:

int a[10000002]={0};
vector<int> sieve(int n) //函数声明, 求n以内的质数
{
	vector<int> num;
    //int a[10000002]={0};

    for(int i=2;i*i<=n;i++)
    {
        if(a[i]==1) continue;
        int temp=2;
        while(temp*i<=n)
        {
            a[temp*i]=1;
            temp++;
        }
    }
    for(int i=2;i<=n;i++)
    {
        if(a[i]!=1) num.push_back(i);
    }
    return num;
}

总结(感谢老师):

        全局变量存储在堆区内存中,局部变量存储在栈区内存中,与栈区变量相比,堆区允许分配更大的内存空间,整形数组a[10000002]所申请的内存空间远大于堆区允许分配的内存空间。因此,若在函数中定义整形数组a[10000002]无法得到正确的内存。

        在竞赛中,通常使用全局变量,1、可以分配更大的内存空间,2、全局变量的值自动初始化为零。

https://www.cnblogs.com/lesroad/p/10389971.html#:~:text=%E9%9D%99%E6%80%81%E5%AD%98%E5%82%A8%E5%8C%BA%EF%BC%9A%E5%86%85%E5%AD%98%E5%9C%A8%E7%A8%8B%E5%BA%8F%E7%BC%96%E8%AF%91%E7%9A%84%E6%97%B6%E5%80%99%E5%B0%B1%E5%B7%B2%E7%BB%8F%E5%88%86%E9%85%8D%E5%A5%BD%

https://www.cnblogs.com/zhangzongjun/p/15520449.html

C/C++中局部/全局变量初始值或默认值问题 - 江北一滴水 - 博客园 (cnblogs.com)

第九章

单项选择题:

6.下列打开文件的表达式中,错误的是:

A.ofstream ofile; ofile.open(“C:\vc\abc.txt”,ios::binary);

B.fstream iofile;iofile.open(“abc.txt”,ios::ate);//相对文件流对象

C.ifstream ifile (“C:\vc\abc.txt”);

D.cout.open(“C:\vc\abc.txt”,ios::binary);

7.下列关于C++的四个预定义流对象的描述中,正确的是____。

A.这四个预定义流对象是由iostream类定义的。

B.这四个预定义流对象中cout是没有缓存的。//只有cerr没有缓存

C.cin对象一次只能读入单个变量。

D.cerr与clog都是用于标准错误输出,默认设备都是显示器。

16已知文本文件的内容是字符串“Manam I’m Adam”,下列语句中哪一项的输出不是“dam”:____

A.char str[30]; ifile.seekg(11, ios::beg); ifile.getline(str, 30); cout << str << endl;

B.char str[30]; ifile.seekg(11, ios::beg); ifile.get(str, 30); cout << str << endl;

C.char str[30]; ifile.seekg(2, ios::beg); ifile.getline(str, 30); cout << str << endl;

//相对位置指针

D.char str[30]; ifile.seekg(11, ios::beg); ifile.get(str, 20); cout << str << endl;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值