前端学C++

1,301 阅读2分钟

这是我参与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包含了containeriteratorfunction objectsalgorithmscontainer包含了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这样的方法,增加了标准度,也减少了容器的复杂度。