2019牛客 c++练习题库01 (个人总结整理)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.下面哪几种是 STL 容器类型( )
答:C++11 STL中的容器有四种:
一.顺序容器:
vector:可变大小数组;
deque:双端队列;
list:双向链表;
forward_list:单向链表;
array:固定大小数组;
string:与vector相同的容器,但专门用于保存字符。二.关联容器:
按关键字有序保存元素:(底层实现为红黑树)
map:关联数组;保存关键字-值对;
set:关键字即值,即只保存关键字的容器。
multimap:关键字可重复的map;
multiset:关键字可重复的set;
三.无序容器:
unordered_ map:用哈希函数组织的map;
unordered_ set:用哈希函数组织的set;
unordered_ multimap:哈希组织的map;关键字可以重复出现;
unordered_ multiset:哈希组织的set;关键字可以重复出现。四.其他项:
stack、queue、valarray、bitset
2.C语言中运算对象必须是整型的运算符是()
答:~、^、&、|、%等都必须两边是整型
/是除法运算符,对运算前后数字类型没有要求。例如:2.4/1.2=2
%是取余运算符,运算符前后必须是整型
例如:4%3=1
3.下面程序的输出结果是( )
答:这题里变量i定义类型分为局部变量和全局变量。
局部值为2,全局为0。
main函数里{}中执行的出来的k值为5+3*2=11;//作用的是局部变量
括号外的K=11+0*3=11; //作用的是全局变量
反映了局部变量的有限性。
4.阅读以下代码:
答:memset的作用:
void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节(typedef unsigned int size_t )
用ch替换并返回s.
作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法,通常为新申请的内存做初始化工作.
1. memset是以字节为单位,初始化内存块。
当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如,
char data[10];
memset(data, 1, sizeof(data)); // right
memset(data, 0, sizeof(data)); // right
而在初始化其他基础类型时,则需要注意,比如,
int data[10];
memset(data, 0, sizeof(data)); // right
memset(data, -1, sizeof(data)); // right
memset(data, 1, sizeof(data)); // wrong, data[x] would be 0x0101 instead of 1
2. 当结构体类型中包含指针时,在使用memset初始化时需要小心。
比如如下代码中,
struct Parameters {
int x;
int* p_x;
};
Parameters par;
par.p_x = new int[10];
memset(&par, 0, sizeof(par));
当memset初始化时,并不会初始化p_x指向的int数组单元的值,而会把已经分配过内存的p_x指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,显而易见也是不应该使用memset来初始化的。
3. 当结构体或类的本身或其基类中存在虚函数时,也需要谨慎使用memset。
这个问题就是在开头项目中发现的问题,如下代码中,
class BaseParameters
{
public:
virtual void reset() {}
};
class MyParameters : public BaseParameters
{
public:
int data[3];
int buf[3];
};
MyParameters my_pars;
memset(&my_pars, 0, sizeof(my_pars));
BaseParameters* pars = &my_pars;
//......
MyParameters* my = dynamic_cast
程序运行到dynamic_cast时发生异常。原因其实也很容易发现,我们的目的是为了初始化数据结构MyParameters里的data和buf,正常来说需要初始化的内存空间是sizeof(int) * 3 * 2 = 24字节,但是使用memset直接初始化MyParameters类型的数据结构时,
sizeof(my_pars)却是28字节,因为为了实现多态机制,C++对有虚函数的对象会包含一个指向虚函数表(V-Table)的指针,当使用memset时,会把该虚函数表的指针也初始化为0,而dynamic_cast也使用RTTI技术,运行时会使用到V-Table,可此时由于与V-Table的链接已经被破坏,导致程序发生异常。
5.下面哪种情况下,B不能隐式转换为A?