1.下面有关C中为什么用模板类的原因描述错误的是? ( A.可用来创建动态增长和减小的数据结构B.它是类型无关的因此具有很高的可复用性C.它运行时检查数据类型保证了类型安全D.它是平台无关的可移植性A.模板可以具有非类型参数用于指定大小可以根据指定的大小创建动态结构B.模板最重要的一点就是类型无关提高了代码复用性C.模板运行时不检查数据类型也不保证类型安全相当于类型的宏替换意思就是实例化后的代码在运行时不再进行额外的类型校验故错误D.只要支持模板语法模板的代码就是可移植的2.下列关于模板的说法正确的是 A.模板的实参在任何时候都可以省略B.类模板与模板类所指的是同一概念C.类模板的参数必须是虚拟类型的D.类模板中的成员函数全是函数模板A. 模板实参省略意思为隐式实例化一般情况下都使用隐式实例化不需指定模板类型参数让编译器进行推导但有些情况下编译器推导时可能会有歧义比如模板参数只有一个类型T但是用两个不同类型隐式实例化templateclassTTAdd(constTx,constTy){returnxy;}intmain(){Add(10,20);// 正确Add(1.2,30);// 编译失败 改正 Addint(1.2, 20) 或者 Add((int)1.2, 20)return0;}所以模板参数不是任何情况下都可以省略要结合具体的使用场景因此A的说法是错误的。B.类模板是一个类家族模板类是通过类模板实例化的具体类C.C中类模板的参数即为模板参数列表中内容有两种方式类型参数和非类型参数类型参数即类型参数化将来实例化为具体的实际类型有点像函数的形参形参可以接受不同值的实参非类型参数在定义时给定了具体的类型用该类型定义的为常量比如templateclassT,size_t Nclassarray{// ...};D.正确定义时都必须通过完整的模板语法进行定义。 因为所有类模板的成员函数放在类外定义时需要在函数名前加类名而类名实际为ClassName所以定义时还需加模板参数列表templateclassTsize_tStackT::size(){return_size;}因此类模板中的成员函数都是函数模板D正确。3.在vs2019下 ,下面程序的输出结果正确的是( )intmain(){stringstr(Hello Bit.);str.reserve(111);str.resize(5);str.reserve(50);coutstr.size():str.capacity()endl;return0;}A.10 50B.5 50C.5 111D.10 111string的void reserve(size_type n)方法是进行容量调整的当n大于string对象的实际容量时会将string对象的容量扩大。但是当n小于string对象的实际容量时具体是将容量缩小还是容量保持不变C标准并没有严格限制具体版本在实现时实现者可能会处于效率、内存分配策略等因素自行决定在vs2019中当n小于string对象的实际容量时容量是不会被缩小的。代码分析:str.reserve(111); //调整容量为 111 str.resize(5); //调整元素个数为 5 str.reserve(50); //调整容量为 50由于调整的容量小于已有空间容量故容量不会减小 所以size5 capacity111 故答案为: C4.关于代码输出正确的结果是( )vs2013 环境下编译运行intmain(intargc,char*argv[]){string ahello world;string ba;if(a.c_str()b.c_str()){couttrueendl;}elsecoutfalseendl;string cb;c;if(a.c_str()b.c_str()){couttrueendl;}elsecoutfalseendl;a;if(a.c_str()b.c_str()){couttrueendl;}elsecoutfalseendl;return0;}A.false false falseB.true false falseC.true true trueD.true true false分析:a 和 b的值虽然相同但是a.c_str()b.c_str()比较的是存储字符串位置的地址a和b是两个不同的对象内部数据存储的位置也不相同因此不相等后面c“”,a与b对象都没有任何的影响所以都不相等故答案为:A5.T是一个数据类型在vs系列编译器中debug模式下关于std::vector::at 和 std::vector::operator[] 描述正确的是( )A.at总是做边界检查 operator[] 不做边界检查.B.at 不做边界检查 operator[] 做边界检查.C.at和operator[] 都是会做边界检查的D.以上都不对注意题目专门强调了vs系列编译器debug模式下at() 和 operator[] 都是根据下标获取任意位置元素的在debug模式下两者都会去做边界检查。当发生越界行为时at 是抛异常operator[] 内部的assert会触发故选择C6.下面这个代码输出的是( )#includeiostream#includevectorusingnamespacestd;intmain(void){vectorintarray;array.push_back(100);array.push_back(300);array.push_back(300);array.push_back(300);array.push_back(300);array.push_back(500);vectorint::iterator itor;for(itorarray.begin();itor!array.end();itor){if(*itor300){itorarray.erase(itor);}}for(itorarray.begin();itor!array.end();itor){cout*itor ;}return0;}A.100 300 300 300 300 500B.100 3OO 300 300 500C.100 300 300 500D.100 300 500E.100 500F.程序错误程序首先把100 300 300 300 300 500进行尾插for(itorarray.begin();itor!array.end();itor){if(*itor300)//向量的数据为300时进行删除{//删除之后迭代器进行返回赋值不会导致迭代器失效删除当前数据//后面的数据相当于会向前移动,此时itor还是指向下一个300数据//但是由于循环回去for循环末尾itor会让迭代器指向下一个//数据因此会错失一次300的比较判断itorarray.erase(itor);}}所以答案为: 100 300 300 5007.下面程序的输出结果正确的是( )intmain(){intar[]{1,2,3,4,5,6,7,8,9,10};intnsizeof(ar)/sizeof(int);vectorintv(ar,arn);coutv.size():v.capacity()endl;v.reserve(100);v.resize(20);coutv.size():v.capacity()endl;v.reserve(50);v.resize(5);coutv.size():v.capacity()endl;}A.10:10 20:100 5:50B.10:20 20:100 5:100C.10:10 20:100 5:100D.10 10 20:20 20:50vectorintv(ar,arn);coutv.size():v.capacity()endl;//大小为数组元素个数因此size10 capacity10v.reserve(100);//预留空间100v.resize(20);//调整元素为20个此时元素的size会改变由于个数小于容量因此容量不会变小coutv.size():v.capacity()endl;// 故size20 capacity100v.reserve(50);//期望预留空间为50可是现在的空间已经有100个所以空间不会减小v.resize(5);//元素个数调整为5coutv.size():v.capacity()endl;// 故size5 capacity100所以答案为:C8.下面有关vector和list的区别描述错误的是( )A.vector拥有一段连续的内存空间因此支持随机存取如果需要高效的随机读取应该使用vectorB.list拥有一段不连续的内存空间如果需要大量的插入和删除应该使用listC.vector::iterator支持“”、“”、“”等操作符D.list::iterator则不支持“”、“”、“”等操作符运算但是支持了[]运算符A.如果想大量随机读取数据操作vector是首选的容器B.如果想大量的插入和删除数据list效率较高是首选C.由于vector底层是连续空间其迭代器就是相应类型的指针所以支持对应的操作D.list迭代器不支持[]运算符9.下面程序的输出结果正确的是( )intmain(){intarray[]{1,2,3,4,0,5,6,7,8,9};intnsizeof(array)/sizeof(int);listintmylist(array,arrayn);autoitmylist.begin();while(it!mylist.end()){if(*it!0)cout*it ;elseitmylist.erase(it);it;}return0;}程序在使用迭代器取值时如果不等于0就进行打印为0时不打印并删除当前节点所以答案为 B10.下面有关vector和list的区别描述正确的是( )A.两者在尾部插入的效率一样高B.两者在头部插入的效率一样高C.两者都提供了push_back和push_front方法D.两者都提供了迭代器且迭代器都支持随机访问A.vector在尾部插入数据不需要移动数据list为双向循环链表也很容易找到尾部因此两者在尾部插入数据效率相同B.vector头部插入效率极其低需要移动大量数据C.vector由于在头部插入数据效率很低所以没有提供push_front方法D.list不支持随机访问11.以下程序输出结果为( )intmain(){intar[]{0,1,2,3,4,5,6,7,8,9};intnsizeof(ar)/sizeof(int);listintmylist(ar,arn);listint::iterator posfind(mylist.begin(),mylist.end(),5);reverse(mylist.begin(),pos);reverse(pos,mylist.end());listint::const_reverse_iterator critmylist.crbegin();while(crit!mylist.crend()){cout*crit ;crit;}coutendl;}A.4 3 2 1 0 5 6 7 8 9B.0 1 2 3 4 9 8 7 6 5C.5 6 7 8 9 0 1 2 3 4D.5 6 7 8 9 4 3 2 1 0程序输出结果为 C。过程如下初始链表0 1 2 3 4 5 6 7 8 9反转前半部分0~44 3 2 1 0 5 6 7 8 9反转后半部分5~94 3 2 1 0 9 8 7 6 5反向迭代器输出从末尾向前即 5 6 7 8 9 0 1 2 3 412.下列代码的运行结果是 voidmain(){stackcharS;charx,y;xn;yg;S.push(x);S.push(i);S.push(y);S.pop();S.push(r);S.push(t);S.push(x);S.pop();S.push(s);while(!S.empty()){xS.top();S.pop();coutx;};couty;}A.gstrinB.stringC.srtingD.stirng初始x‘n’, y‘g’。S.push(x); - 推入’n’堆栈底部-顶部‘n’S.push(‘i’); - 推入’i’堆栈‘n’,‘i’S.push(y); - 推入’g’堆栈‘n’,‘i’,‘g’S.pop(); - 弹出顶部元素弹出’g’堆栈‘n’,‘i’S.push(‘r’); - 推入’r’堆栈‘n’,‘i’,‘r’S.push(‘t’); - 推入’t’堆栈‘n’,‘i’,‘r’,‘t’S.push(x); - 推入’n’x仍是’n’堆栈‘n’,‘i’,‘r’,‘t’,‘n’S.pop(); - 弹出顶部元素弹出’n’堆栈‘n’,‘i’,‘r’,‘t’S.push(‘s’); - 推入’s’堆栈‘n’,‘i’,‘r’,‘t’,‘s’现在堆栈中有5个元素从底部到顶部‘n’,‘i’,‘r’,‘t’,‘s’然后while循环当堆栈非空时弹出顶部并输出。所以顺序是先输出顶部’s’然后’t’然后’r’然后’i’然后’n’。所以输出“strin”注意顺序弹出s - 输出s弹出t - 输出t弹出r - 输出r弹出i - 输出i弹出n - 输出n所以输出strin。然后循环结束后执行couty; 输出yy‘g’。所以整体输出“string”“strin”“g” “string”。所以结果是string。13.下列代码的运行结果是 intmain(){priority_queueinta;priority_queueint,vectorint,greaterintc;priority_queuestringb;for(inti0;i5;i){a.push(i);c.push(i);}while(!a.empty()){couta.top() ;a.pop();}coutendl;while(!c.empty()){coutc.top() ;c.pop();}coutendl;b.push(abc);b.push(abcd);b.push(cbd);while(!b.empty()){coutb.top() ;b.pop();}coutendl;return0;}A.4 3 2 1 0 0 1 2 3 4 cbd abcd abcB.0 1 2 3 4 0 1 2 3 4 cbd abcd abcC.4 3 2 1 0 4 3 2 1 0 abc abcd cbdD.0 1 2 3 4 4 3 2 1 0 cbd abcd abcpriority_queue a; //a是大堆priority_queueint, vector, greater c; //c指定了比较规则是小堆priority_queue b; //b是大堆注意b是字符串之间的比较因此分别建堆的过程是建立a大堆c小堆b大堆所以出队的顺序就按照其优先级大小出队所以答案为A14假设cont是一个Container 的示例里面包含数个元素那么当CONTAINER为1.vector 2.list 3.deque 会导致下面的代码片段崩溃的Container 类型是 intmain(){Container cont{1,2,3,4,5};Container::iterator iter,tempIt;for(itercont.begin();iter!cont.end();){tempItiter;iter;cont.erase(tempIt);}}A.1, 2B.2, 3C.1, 3D.1, 2, 3vector、deque底层都是用了连续空间所以虽然iter迭代器了但是erase(tempit)以后底层是连续空间删除会挪动数据最终导致iter意义变了已失效了。而list不是连续空间删除以后tempIt虽然失效了但是不影响iter。15.说法正确的是( )A.deque的存储空间为连续空间B.list迭代器支持随机访问C.如果需要高效的随机存取还要大量的首尾的插入删除则建议使用dequeD.vector容量满时那么插入元素时只需增加当前元素个数的内存即可A.deque底层总体为不连续空间B.不支持因为底层是一个个的不连续节点C.正确D.一般会以容量的2倍扩充容量这是为了减少扩容的次数减少内存碎片16.说法正确的是( )A.deque的存储空间为连续空间B.list迭代器支持随机访问C.如果需要高效的随机存取还要大量的首尾的插入删除则建议使用dequeD.vector容量满时那么插入元素时只需增加当前元素个数的内存即可A.deque底层总体为不连续空间B.不支持因为底层是一个个的不连续节点C.正确D.一般会以容量的2倍扩充容量这是为了减少扩容的次数减少内存碎片17.假设cont是一个Container 的示例里面包含数个元素那么当CONTAINER为1.vector 2.list 3.deque 会导致下面的代码片段崩溃的Container 类型是 intmain(){Container cont{1,2,3,4,5};Container::iterator iter,tempIt;for(itercont.begin();iter!cont.end();){tempItiter;iter;cont.erase(tempIt);}}A.1, 2B.2, 3C.1, 3D.1, 2, 3此题主要考察cont.erase(tmpit)删除数据之后迭代器失效相关问题本题重点要关注的是底层实现vector、deque底层都是用了连续空间所以虽然iter迭代器了但是erase(tempit)以后底层是连续空间删除会挪动数据最终导致iter意义变了已失效了。而list不是连续空间删除以后tempIt虽然失效了但是不影响iter。18.以下程序运行结果正确的是( )templatetypenameTypeTypeMax(constTypea,constTypeb){coutThis is MaxTypeendl;returnab?a:b;}templateintMaxint(constinta,constintb){coutThis is Maxintendl;returnab?a:b;}templatecharMaxchar(constchara,constcharb){coutThis is Maxcharendl;returnab?a:b;}intMax(constinta,constintb){coutThis is Maxendl;returnab?a:b;}intmain(){Max(10,20);Max(12.34,23.45);Max(A,B);Maxint(20,30);return0;}A.This is Max This is Max This is Max This is MaxB.This is Max This is Max This is Max This is MaxC.This is Max This is Max This is Max This is MaxD.This is Max This is Max This is Max This is Max分析:Max(10,20); //能够直接匹配int参数调动非模板函数Max(12.34,23.45); //double类型参数没有最佳匹配函数此时只能调动模板函数Max(‘A’,‘B’); //能够直接匹配char参数,调动非模板函数Max(20,30); //由于直接实例化了函数因此要调动模板函数但是由于进行函数的int特化所以会调动特化版本的模板函数故答案为: A