以下是自己学习过程中碰到的一些可能在面试中考到的题目,在这里做个总结:
STL与泛型编程部分
1.STL与泛型编程的关系
2.什么是STL六大组件,分别起什么作用?
容器部分
顺序容器与关联容器:
关于顺序容器和关联容器,有些东西不写容易忘,在此加强一下:
(1)vector<int>a
,假设a有5个元素,现在要删除第二个元素怎么写?在第一个元素和第二个元素之间插入一个3呢?
(2)在使用顺序容器的时候,能用vector尽量用vector,需要注意的是,vector容器并不适合多次删除或增加中间元素,vector只适合频繁在尾部增/删元素,如果非要在中间元素添加,有哪两种解决办法?
(3)C++中一共有哪几种顺序容器结构,其中哪两种是C++11新添的?
(4)vector<vector<int>>a
怎么表示二维数组的行和列?
(5)如何表示出vector容器中的最值,比如说求vector<int>num
的最大值和最小值;
(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)vector<int>a
,假设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<vector<int>>a
怎么表示二维数组的行和列?
答: 行数为mat.size(),列数为mat[0].size;
(5)如何表示出vector容器中的最值,比如说求vector<int>num
的最大值和最小值;
答: 关于这个算法,在头文件<algorithm>
里面。利用算法里面的max_element和min_element函数可以返回容器里面最值的迭代器,由于迭代器是一个复杂的指针 ,所以对指针取值即可得到最值,如:
#include<algorithm>
#include<vector>
#include<iostream>
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