2019牛客 c++练习题库01 (个人总结整理)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(pars);

程序运行到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?

相关文档
最新文档