C++笔记和面试问题整理(一)-------STL与泛型编程

以下是自己学习过程中碰到的一些可能在面试中考到的题目,在这里做个总结:

STL与泛型编程部分

1.STL泛型编程的关系

2.什么是STL六大组件,分别起什么作用?

容器部分

顺序容器与关联容器
关于顺序容器和关联容器,有些东西不写容易忘,在此加强一下:

(1)vectora,假设a有5个元素,现在要删除第二个元素怎么写?在第一个元素和第二个元素之间插入一个3呢?

(2)在使用顺序容器的时候,能用vector尽量用vector,需要注意的是,vector容器并不适合多次删除或增加中间元素,vector只适合频繁在尾部增/删元素,如果非要在中间元素添加,有哪两种解决办法?

(3)C++中一共有哪几种顺序容器结构,其中哪两种是C++11新添的?

(4)vector>a怎么表示二维数组的行和列?

(5)如何表示出vector容器中的最值,比如说求vectornum的最大值和最小值;

(6)关联容器中,map、set、multimap和multiset哪些是稳定排序?

(7)如何底层实现关联容器set?

适配器部分
1.STL提供了三种容器适配器:stack,queue,priority_queue,具体过程是如何实现的?

算法部分

迭代器部分

1.什么是迭代器?


参考答案

STL与泛型编程

1.STL泛型编程的关系

STL:Standard Template Library——标准模板库,STL是一组用于处理各种容器对象的模板。STL演示了一种编程模式——泛型编程。

2.什么是STL六大组件,分别起什么作用?
STL六大组件:
算法(Algorithm)
是用来操作容器中的数据的模板函数。
例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个 list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;

容器(Container)
是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;

迭代器(Iterator)
提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;

仿函数(Functor)
仿函数(functor)又称之为函数对象(function object),其实就是重载了()操作符的struct,没有什么特别的地方

容器适配器(Adaptor)
适配器就是以序列式容器为底层数据结构,进一步封装了的为适应场景应用的容器。STL中提供了三种适配器,分别为stack,queue和priority_queue。

空间配制器(allocator)
其中主要工作包括两部分1.对象的创建与销毁 2.内存的获取与释放

容器部分

顺序容器与关联容器
答案:
(1)vectora,假设a有5个元素,现在要删除第二个元素怎么写?在第一个元素和第二个元素之间插入一个3呢?

答:a.erase(a.begin()+1)a.erase(a.begin()+1,a.begin()+2);

    a.insert(a.begin()+1,3);

(2)在使用顺序容器的时候,能用vector尽量用vector,需要注意的是,vector容器并不适合多次删除或增加中间元素,vector只适合频繁在尾部增/删元素,如果非要在中间元素添加,有哪两种解决办法?

答: 1.可以在尾部加,再使用sort()函数排序
2.可以先用List,在把List拷贝入Vector。

(3)C++中一共有哪几种顺序容器结构,其中哪两种是C++11新添的?
答: vector、list、forward_list、deque、array、string 。 forward_list和array是新增的,array与内置数组相比,更安全易用。

(4)vector>a怎么表示二维数组的行和列?
答: 行数为mat.size(),列数为mat[0].size;

(5)如何表示出vector容器中的最值,比如说求vectornum的最大值和最小值;

答: 关于这个算法,在头文件里面。利用算法里面的max_element和min_element函数可以返回容器里面最值的迭代器,由于迭代器是一个复杂的指针 ,所以对指针取值即可得到最值,如:

#include
#include
#include
using std::vector;
using std::max_element;//do not forget
using std::min_element;
int main(){
     vector<int>num{1,2,3,4,5};
     vector<int>::iterator max=max_element(num.begin(),num.end());
     vector<int>::iterator min=min_element(num.begin(),num.end());
     std::cout<<"最大值为"<<*max<<std::endl;
     std::cout<<"最小值为"<<*min<<std::endl;
}

(6)关联容器中,map、set、multimap和multiset哪些是稳定排序?

答: map和set是稳定排序,multimap和multiset不是稳定排序。

(7)如何底层实现关联容器set?

答: 如何底层实现关联容器set?

迭代器
1.什么是迭代器?

迭代器是一个广义的指针,实际上,它可以是指针,也可以是一个可对其执行类似指针的操作(如接触引用operator*()和递增Operator++())的对象。通过将指针广义化为迭代器,让STL能够为不同的容器提供统一的接口。

迭代器的类型是一个名为iterator的typedef,作用域为整个类。

PS:有的容器不仅可以用迭代器来表示元素值,也可以用元素下标表示元素值,比如vector就可以用下标和迭代器同时表示。
但实际上大部分容器是只能用通过迭代器来调用容器中的元素值的。

参考文献:
https://blog.csdn.net/u014744118/article/details/50727193

你可能感兴趣的:(笔记,C++)