1.以下哪项不属于STL container?( )
A.stack
B.queue
C.multimap
D.string
正确答案: D 你的答案: C (错误)
解析:
STL container分为两大类:
序列容器:动态数组vector,双端队列 deque,链表list
关联容器:set,map,multiset,multimap,bitset
容器适配器:stack,queue,priority_queue
string 是顺序容器类型;
stack 是适配器;
2.下面代码打印结果为()
union package
{
char head;
int body;
};
struct message
{
char id;
int crc;
union package pack;
};
int main()
{
printf("size=%d\n",sizeof(struct message));
return 0;
}
A.9
B.10
C.11
D.12
正确答案: D 你的答案: B (错误)
解析:izeof(union),以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真正存储于该地址。内存对齐
3.当很频繁地对序列中部进行插入和删除操作时,应该选择使用的容器是()
A.vector
B.list
C.deque
D.stack
正确答案: B 你的答案: A (错误)
ABC 是顺序性容器:
vector: 是一段连续的内存块
list:是所有的数据元素分开保存,可以是任何两个元素没有连续
deque:是多个连续的内存块
三者区别:
vector:查询性能好,并且在末端增加数据也很好,除非它重新申请内存, 适合高效地随机存储
list:是一个链表,任何一个元素可以是不连续的,但它都有两个指向上一元素和下一元素的指针,所以它对插入、删除元素性能是最好的,而 查询性能非常差; 适合大量地插入和删除操作而不关心随即存储 的要求
deque: 介于两者之间,兼顾了数组和链表的优点,它是分块的链表和多个数组的结合,所有它有比list好的查询性能,比vector好的插入、删除性能。
如果你需要随机存取又关心两端数据的插入和删除,那么deque是最佳之选。
D(stack)是容器适配器:
是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进先出(FILO)
的数据结构。
C++ STL 的实现:
vector 底层数据结构为数组 ,支持快速随机访问
list 底层数据结构为双向链表,支持快速增删
deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问
stack 底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
queue 底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
45是适配器,而不叫容器,因为是对容器的再封装
priority_queue 的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现
set 底层数据结构为红黑树,有序,不重复
multiset 底层数据结构为红黑树,有序,可重复
.map 底层数据结构为红黑树,有序,不重复
multimap 底层数据结构为红黑树,有序,可重复
hash_set 底层数据结构为hash表,无序,不重复
hash_multiset 底层数据结构为hash表,无序,可重复
hash_map 底层数据结构为hash表,无序,不重复
hash_multimap 底层数据结构为hash表,无序,可重复
4.下面哪个标识符是合法的?
A."9HelloWorld"
B."_Hello World"
C."Hello*World"
D."Hello$World"
正确答案: D 你的答案: B (错误)
解析:1、一看就知道是D。
2、java的变量名有三种元素构成:数字+字符+$+下划线。
3、java对这三种元素的顺序也是有要求的:不能以数字开头+不能是关键字.
4、A中错在以数字开头、B中错在有空格、C中错在有*.
5.下列程序的输出是:( )
#define add(a,b) a+b
int main()
{
printf(“ % d\n”, 5 * add(3, 4));
return 0;
}
A.23
B.35
C.16
D.19
正确答案: D 你的答案: B (错误)
解析:这时候应该给 #define add(a+b) a+b 的a+b 带上括号 变成 #define add(a+b) (a+b)
这是一个习惯问题,宏定义的若是一个算术表达式或者其他运算表达式 务必加上括号
选D 5*3+4=19