目录
第七章
单项选择题:
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/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;