这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
浅尝STL
using
在探索STL之前,先看看using,在各种例程中
using namespace std
这样的表达屡见不鲜,简单地理解起来就像别的语言中的import一样,
而
using std::cout
跟
from torch import nn
是类似的,从某个包或者namespace引某个函数。
但细究起来,using还有其他的用法。
typedef int T; // 用 T 代替 int
using T = int; // 和上面的语句等效
class Base{
public:
void BaseMethod(int n)
protected:
int baseVal
}
class Extended :: private Base{
public:
using Base::BaseMethod //类继承中using的用法
using Base::baseVal
}
STL
回到C++ STL,STL包含了一些模板类vector,deque,set等,如果对数据结构稍有了解,就能猜出这些模板类的作用,也能意识到这些轮子对日常编码的帮助。
具体而言,C++ STL包含了container、iterator,function objects和algorithms。container包含了vector等承载数据的容器;iterator可视为广义指针,帮助遍历容器元素;function objects是表现得如同函数的类;algorithms是常用的排序、查找等算法。
std::vector
#include vector
using namespace std;
vector ratings(5);
cin >> n;
vector scores(n);
vector的使用看上去跟array一样,但是vector像我熟悉的脚本语言中的数组一样,是可以动态拓展的:
vector<int> vecTemp;
for (int i = 0; i<6; i++)
vecTemp.push_back(i);
当然,这么做从底层上,当内存不够用时,需要去申请内存和进行内存拷贝(vector使用的内存空间是连续的)。了解了vector在内存使用上的特点,我们会明白它随机访问快(连续内存空间,只要找到头指针往后数就行),进而尾部插入快(找到尾地址往后存就行);但是中间和头部插入慢(要挪位置的不止一个元素)。
vector::iterator pr;
for (pr = books.begin(); pr != books.end(); pr++)
ShowReview(*pr);
for_each(books.begin(), books.end(), ShowReview); \\ 上面的循环可以用std::for_each函数实现
这个例子体现了STL的哲学,用同一个函数去完成对于STL各种容器的遍历、打乱等操作,而不是去扩展vector.for_each这样的方法,增加了标准度,也减少了容器的复杂度。