目录
一、选择题
二、编程题
三、选择题题解
四、编程题题解
一、选择题
1、以下关于STL的描述中,()是错的
A. STL容器是线程不安全的
B. 当容量不够时,STL的一个典型实现是vector内部内存扩展方式为翻倍
C. std::sort是稳定排序
D. std::bitset不是一个STL容器
2、以下STL的容器存放的数据,哪个肯定是排好序的()
A. vector
B. deque
C. list
D. map
3、以下哪种STL容器中的对象是连续存储的()
A. list
B. vector
C. map
D. set
4、STL中的哪种结构在增加成员时可能会引起原有成员的存储位置发生改变()
A. map
B. set
C. list
D. vector
5、STL中的一级容器有:
A. vector, deque, list, set, multiset, map, multimap.
B. 序列容器,关联容器,容器适配器
C. set, multiset, map, multimap.
D. vector, deque, list.
6、STL中的unordered_map和priority_queue使用的底层数据结构分别是什么()
A. rbtree,queue
B. hashtable,heap
C. rbtree,heap
D. hashtable,queue
7、下面关于迭代器失效的描述哪个是错误的()
A. vector的插入操作不会导致迭代器失效
B. map的插入操作不会导致迭代器失效
C. vector的删除操作只会导致指向被删除元素及后面的迭代器失效
D. map的删除操作只会导致指向被删除元素的迭代器失效
8、如何捕获异常可以使得代码通过编译?
class A
{
public:
A(){}
};
void foo()
{
throw new A;
}
A. catch (A && x)
B. catch (A * x)
C. catch (A & x)
D. 以上都是
9、有如下程序段:则程序输出:
#include <iostream>
using namespace std;
class A
{
public:
~A()
{
cout << "~A()";
}
};
class B
{
public:
virtual ~B()
{
cout << "~B()";
}
};
class C: public A, public B
{
public:
~C()
{
cout << "~C()";
}
};
int main()
{
C * c = new C;
B * b1 = dynamic_cast<B *>(c);
A * a2 = dynamic_cast<A *>(b1);
delete a2;
return 0;
}
A. ~C()~B()~A()
B. ~C()~A()~B()
C. A)B)都有可能
D. 以上都不对
10、以下程序输出结果是___
class A
{
public:
A ():m_iVal(0){test();}
virtual void func() { std::cout<<m_iVal<<‘ ’;}
void test(){func();}
public:
int m_iVal;
};
class B : public A
{
public:
B(){test();}
virtual void func()
{
++m_iVal;
std::cout<<m_iVal<<‘ ’;
}
};
int main(int argc ,char* argv[])
{
A*p = new B;
p->test();
return 0;
}
A. 1 0
B. 0 1
C. 0 1 2
D. 2 1 0
E. 不可预期
F. 以上都不对
二、编程题
1、统计每个月兔子的总数 题目链接
2、字符串通配符 题目链接
三、选择题题解
1、以下关于STL的描述中,()是错的
A. STL容器是线程不安全的
B. 当容量不够时,STL的一个典型实现是vector内部内存扩展方式为翻倍
C. std::sort是稳定排序
D. std::bitset不是一个STL容器
正确答案:C
题解:
sort是不稳定的排序,底层是使用快排的思想;STL中提供了一个稳定的排序,stable_sort,底层是使用归并排序的思想;
2、以下STL的容器存放的数据,哪个肯定是排好序的()
A. vector
B. deque
C. list
D. map
正确答案:D
题解:
map底层是红黑树,红黑树是二叉搜索树的一种;
3、以下哪种STL容器中的对象是连续存储的()
A. list
B. vector
C. map
D. set
正确答案:B
题解:
只有vector是在堆上申请一块连续的空间进行管理;
4、STL中的哪种结构在增加成员时可能会引起原有成员的存储位置发生改变()
A. map
B. set
C. list
D. vector
正确答案:D
题解:
vector是申请一块连续的空间,在这块连续的空间依次存储数据;当在某个位置插入数据时,插入位置后面的数据都要挪动;
5、STL中的一级容器有:
A. vector, deque, list, set, multiset, map, multimap.
B. 序列容器,关联容器,容器适配器
C. set, multiset, map, multimap.
D. vector, deque, list.
正确答案:D
题解:
首先我们要了解一级容器的概念,所谓一级容器就是存储数据类型不能是组合型的;如map,储存的是KeyValue键值对;故此题选D;
6、STL中的unordered_map和priority_queue使用的底层数据结构分别是什么()
A. rbtree,queue
B. hashtable,heap
C. rbtree,heap
D. hashtable,queue
正确答案:B
题解:
unordered_map底层是哈希表,priority_queue底层是堆;
7、下面关于迭代器失效的描述哪个是错误的()
A. vector的插入操作不会导致迭代器失效
B. map的插入操作不会导致迭代器失效
C. vector的删除操作只会导致指向被删除元素及后面的迭代器失效
D. map的删除操作只会导致指向被删除元素的迭代器失效
正确答案:A
题解:
vector的插入会导致迭代器失效;会影响插入以及插入位置后面的所有元素;
8、如何捕获异常可以使得代码通过编译?
class A
{
public:
A(){}
};
void foo()
{
throw new A;
}
A. catch (A && x)
B. catch (A * x)
C. catch (A & x)
D. 以上都是
正确答案:B
题解:
题目考察C++中的异常,throw的后面是new一个A类对象,返回A类型指针,若是失败了,catch那里参数必须是A类型指针才可以;故选B;
9、有如下程序段:则程序输出:
#include <iostream>
using namespace std;
class A
{
public:
~A()
{
cout << "~A()";
}
};
class B
{
public:
virtual ~B()
{
cout << "~B()";
}
};
class C: public A, public B
{
public:
~C()
{
cout << "~C()";
}
};
int main()
{
C * c = new C;
B * b1 = dynamic_cast<B *>(c);
A * a2 = dynamic_cast<A *>(b1);
delete a2;
return 0;
}
A. ~C()~B()~A()
B. ~C()~A()~B()
C. A)B)都有可能
D. 以上都不对
正确答案:D
题解:
本题考察多态,我们创建了一个C类对象,C类对象继承了A类与B类,我们把new出来的对象的地址赋值给c,接着把从切片赋值给子类b1,这是我们再把b1赋值给类型完全没关系的A类指针a2,最后delete a2,此时会导致运行崩溃;
10、以下程序输出结果是___
class A
{
public:
A ():m_iVal(0){test();}
virtual void func() { std::cout<<m_iVal<<‘ ’;}
void test(){func();}
public:
int m_iVal;
};
class B : public A
{
public:
B(){test();}
virtual void func()
{
++m_iVal;
std::cout<<m_iVal<<‘ ’;
}
};
int main(int argc ,char* argv[])
{
A*p = new B;
p->test();
return 0;
}
A. 1 0
B. 0 1
C. 0 1 2
D. 2 1 0
E. 不可预期
F. 以上都不对
正确答案:C
题解:
前面几次题目我们讲过,再构造函数内,我们调用虚函数并不会有多态,因此虚表指针都是再构造函数初始化对象的时候初始化的;我们再看题目,首先new一个子类,会先调用父类构造函数,父类构造函数调用test,test调用父类的func,打印0;接着就初始化子类那一部分,子类构造函数内调用test,test调用子类func,对m_iVal++并打印,打印1;最后将new出来的对象交给父类指针指向,父类指针调用test,test调用func,引发多态,父类指针调用虚函数,调用子类func,打印2;故选C;
四、编程题题解
1、统计每个月兔子的总数
思路:仔细阅读题目,我们不难发现,题目就是让我们求斐波那契数列的第n项;下图画出1到7月一月、二月、三月大的兔子的个数分别是多少;发现就是我们的斐波那契数列;
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int f1 = 1;
int f2 = 1;
int f3;
for(int i = 3; i <= n; i++)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
cout << f3 << endl;
return 0;
}
2、字符串通配符
思路:我们可以用递归的思想来解决该题,当我们遇到 '?'时,我们将分别指向这两个字符串的指针往后挪动一下;如果遇到‘*’时,我们可以分为三种情况,第一种情况是*不匹配任何字符,第二种情况*匹配一个字符,第三种情况*匹配两个即以上字符;具体看代码;
#include <cctype>
#include <iostream>
using namespace std;
bool strMach(const char* p, const char* q)
{
// 双方都走完才算匹配
if(*p == '\0' && *q == '\0')
return true;
// 只有其中一方走完不算匹配
if(*p == '\0' || *q == '\0')
return false;
if(*p == '?' && (isalnum(*q) || isalpha(*q)))
return strMach(p + 1, q + 1);
else if(*p == '*' && (isalnum(*q) || isalpha(*q)))
{
while(*p=='*')
{
p++;
}
p--;
return strMach(p + 1, q) // 匹配0个
|| strMach(p + 1, q + 1) // 匹配1个
|| strMach(p, q + 1); // 匹配多个
}
else if(tolower(*p) == tolower(*q))
return strMach(p + 1, q + 1);
return false;
}
int main()
{
string pattern, str;
cin >> pattern >> str;
bool ret = strMach(pattern.c_str(), str.c_str());
if(ret)
cout << "true" << endl;
else
cout << "false" << endl;
return 0;
}