C++——STL(标准模板库)

C++强大的原因之一是得益于他强大的标准模板库

标准模板库 简称STL (Standard Template Library)

STL为程序员提供了强大的功能,例如类似于数组操作:数组的计算,数组的大小,数组的排序,数组的插入等等。

STL的六大组件

容器:存放数据

算法:处理数据

迭代器:对容器进行通用表示

仿函数:通用的处理数据

适配器:修饰容器或者仿函数改变其特性

配置器:负责空间的配置和管理

vector,STL中常用的容器

包含在头文件

指出要实例化的类型,其中[]被重载,可像访问数组中的元素那样访问vector。他的构造函数可指出初始化长度。

#include 
#include 
using namespace std;

int main()
{
    const int n = 10;
    //initialized length = 10
    vector vec (n);
    for(int i=0;i> vec[i];
    }
    for(int i=0;i

运行结果

C++——STL(标准模板库)_第1张图片

可对vector执行的操作

cout  << "\nSize is  " << vec.size();

交换两个容器内的内容

#include 
#include 
using namespace std;

int main()
{
    const int n = 3;
    //initialized length = 10
    vector vec1 (n);
    vector vec2 (n);
    for(int i=0;i

 运行结果

C++——STL(标准模板库)_第2张图片


容器和迭代器

在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。 

简单点来说就是存储数据用的(当然不只是存储),形象的把他称为容器。

迭代器是一种检查容器内元素并遍历元素的数据类型。 C++更趋向于使用迭代器而不是下标操作。

简单的来说他是一个广义指针(也可以是一个指针),可以使用类似指针的操作(如解引用,自增)。

就像用数组下表模拟指针一样,模拟指针的int类型就相当于一个广义上的指针。

两个类方法

begin()——返回指向容器中起一个元素的迭代器。 

end()   ——返回一个表示超过容器尾部的迭代器(其实就是最后一个元素的下一个,类似于c风格字符串中的'\0')。

标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只有少数容器(如vector)支持下标操作访问容器元素。 每种容器都定义了自己的迭代器类型,如vector: 每种容器都定义了一对名为begin和en的函数,用于返回迭代器。 下面对迭代器进行初始化操作: 注意end并不指向容器的任何元素,而是指向容器的最后元素的下一位置,称为超出末端迭代器。 如果vector为空,则begin返回的迭代器和end返回的迭代器相同。

迭代器的类型是一个名为iteratortypedef(就像string那样)。其作用域为整个类。


可以用迭代器代替下标历遍容器,代码如下

#include 
#include 
#include 
using namespace std;

int main()
{
    srand(time(NULL));
    const int n = 10;
    //initialized length = 10
    vector vec (n);
    vector::iterator pvec;
    for(int i=0;i

运行结果

接着来说vector的类方法

push_back()——将元素添加到容器末尾,内存不够时自动开辟。

#include 
#include 
#include 
using namespace std;

int main()
{
    srand(time(NULL));
    const int n = 10;
    //initialized length = 10
    vector vec (n);
    vector::iterator pvec;
    cout << "Before Size is " << vec.size() << endl;
    for(int i=0;i

运行结果

C++——STL(标准模板库)_第3张图片

 erase()——删除给定区间中的元素,它接受两个迭代器作为参数。起一个迭代器指向删除元素的启示位置,并且删除,第二个迭代器参数指向区间末尾,并且不删除。即删除[a, b)

#include 
#include 
#include 
using namespace std;

int main()
{
    srand(time(NULL));
    const int n = 10;
    vector vec (n);
    vector::iterator pvec;
    for(int i=0;i

 insetr()——将一个容器中的区间插入到另一个容器中的指定位置。他接受三个迭代器参数。

第一个迭代器指向被插入容器的位置。后两个迭代器表示源容器的插入区间 [a, b)

#include 
#include 
#include 
using namespace std;

int main()
{
    vector  old_vec (10,5);
    vector  new_vec (10,6);
    for(int i=0;i<10;i++){
        old_vec[i] = i ;
    }
    new_vec.insert(new_vec.begin()+3,old_vec.begin()+4,old_vec.begin()+6);
    auto pv = new_vec.begin(); //C++11
    for(; pv < new_vec.end(); pv++){
        cout << *pv << " ";
    }
    return 0;
}

 运行结果

C++——STL(标准模板库)_第4张图片

 通用的STL函数

for_each()——可代替for循环的函数()。接受三个参数,前两个迭代器指向容器中的元素,代表一个区间,最后一个参数是一个指向函数的指针。其作用是将区间中的元素执行函数指针指向函数的操作。并且不能修改容器中的值。

#include 
#include 
#include 
using namespace std;


void show(int & a)
{
    cout << "这个元素是" << a << endl;
}
int main()
{
    const int n = 10;
    void (*pfunc) (int&) = show;
    vector  vec (n,6);
    for(int i=0;i::iterator pvb = vec.begin();
    auto pve = vec.end();
    for_each(pvb, pve, pfunc);
    return 0;
}

运行结果

C++——STL(标准模板库)_第5张图片

random_shuffle()接受两个迭代器指向容器的区间,并对其随机排列。

random_shuffle(pvb,pve);

运行结果

C++——STL(标准模板库)_第6张图片

 sotr()——该函数有两个重载版本,其中一个版本接受两个指向容器元素的迭代器,代表一个区间,对其进行升序排序(使用模板类自带的重载后的 < ),如果是用户自定义的 数据类型,则需要重载 < 。

#include 
#include 
#include 
using namespace std;
void show(int & a)
{
    cout << a << " ";
}
int main()
{
    const int n = 10;
    void (*pfunc) (int&) = show;
    vector  vec (n,6);
    for(int i=0;i::iterator pvb = vec.begin();
    auto pve = vec.end();
    random_shuffle(pvb,pve);
    for_each(pvb, pve, pfunc);
    sort(pvb,pve);
    cout << endl;
    for_each(pvb, pve, pfunc);
    return 0;
}

另一个重载版本则:前两个参数不变,后一个参数接受一个函数指针(返回值为bool类型),true和false表示调用函数的两个参数顺序是否正确。如果不正确则变为正确的顺序。这样做就可以变为升序排序。

bool compare(int &a, int &b)
{
    return a > b;
}
#include 
#include 
#include 
using namespace std;
void show(int & a)
{
    cout << a << " ";
}

bool compare(int &a, int &b)
{
    return a > b;
}
int main()
{
    const int n = 10;
    void (*pfunc) (int&) = show;
    vector  vec (n,6);
    for(int i=0;i::iterator pvb = vec.begin();
    auto pve = vec.end();
    random_shuffle(pvb,pve);
    for_each(pvb, pve, pfunc);
    sort(pvb,pve, compare);
    cout << endl;
    for_each(pvb, pve, pfunc);
    return 0;
}

类似的其他类型也可以使用以上函数,例如string,char,double。

#include 
#include 
#include 
using namespace std;
void show(double & a)
{
    cout << a << " ";
}

bool compare(double &a, double &b)
{
    return a > b;
}
int main()
{
    const int n = 10;
    void (*pfunc) (double&) = show;
    vector  vec (n,6);
    for(int i=0;i::iterator pvb = vec.begin();
    auto pve = vec.end();
    random_shuffle(pvb,pve);
    for_each(pvb, pve, pfunc);
    sort(pvb,pve, compare);
    cout << endl;
    for_each(pvb, pve, pfunc);
    return 0;
}

 运行结果

C++——STL(标准模板库)_第7张图片

#include 
#include 
#include 
using namespace std;
void show(string & a)
{
    cout << a << endl;
}

int main()
{
    const int n = 5;
    void (*pfunc) (string&) = show;
    vector  vec (n);
    vec[0] = "begin";
    vec[1] = "hello";
    vec[2] = "world";
    vec[3] = "C++";
    vec[4] = "STL use";
    auto pvb = vec.begin(); //vector::iterator pvb = vec.begin();
    auto pve = vec.end();
    random_shuffle(pvb,pve);
    for_each(pvb, pve, pfunc);
    sort(pvb,pve);
    cout << endl;
    for_each(pvb, pve, pfunc);
    return 0;
}

运行结果

C++——STL(标准模板库)_第8张图片


也可以使用这样的for循环,就像使用int,double的那样。

#include 
using namespace std;

int main()
{
    int num[10] = {1,2,3,5,4,6,9,8,7,0};
    for(int a : num){
        cout << a << " ";
    }
    return 0;
}
#include 
#include 
using namespace std;

int main()
{
    const int n = 5;
    vector  vec (n);
    vec[0] = "begin";
    vec[1] = "hello";
    vec[2] = "world";
    vec[3] = "C++";
    vec[4] = "STL use";
    for(auto & x : vec){
        cout << x << endl;
    }
    return 0;
}

运行结果

C++——STL(标准模板库)_第9张图片

你可能感兴趣的:(C++,c++,泛型,stl)