C++容器和迭代器

模板

泛型编程: 编写能够正确处理以参数形式呈现的各种类型的代码,
只要这些参数类型满足特定的语法和语义要求。

容器和迭代器

STL是一个用于处理C++程序中数据的可扩展框架。


存储和处理数据


double* get_from_jack(int* count); //jack将double值存入一个数组并将元素籍由*count返回
vector<double>* get_from_jill(); //jill填充vector

void fct()
{
    int jack_count = 0;
    double* jack_data = get_from_jack(&jack_count);
    vector<double>* jill_data = get_from_jill();
    //...处理...
    delete[] jack_data;
    delete jill_data;
}


处理数据

void fct()
{
    int jack_count = 0;
    double* jack_data = get_from_jack(&jack_count);
    vector<double>* jill_data = get_from_jill();
    
    double h = -1;
    double* jack_high;// jack_high将指向值最大的元素
    double* jill_high;// jill_high将指向值最大的元素
    for (int i=0; i<jack_count; ++i)
        if (h<jack_data[i])
        {
            jack_high = &jack_data[i]; //保存最大元素的地址
            h = jack_data[i]; //更新"最大元素"
         }

    h = -1;
    for (int i=0; i<jill_data->size(); ++i)
        if (h<(*jill_data)[i])
        {
            jill_high = &(jill_data)[i]; //保存最大元素的地址
            h = (*jill_data)[i]; //更新"最大元素"
         }
    cout<<"jill max:" << *jill_high
    << "jack max:" << *jack_high;

    delete[] jack_data;
    delete jill_data;
}
然而,*jill_data[i]并不是我们想要的结果,因为运算符[]的优先级要高于运算符*,
所以这个表达式的含义是*(jill_data[i]), 必须在*jill_data外使用括号,结果即为(*jill_data)[i]。


泛化代码

我们希望使用统一的方法来访问和处理数据,这样可以避免因为每次获得的数据格式不同
而编写不同的处理代码。
vector<double>& v = *jill_data;
   for (int i=0; i<v.size(); ++i)
        if (h<v.[i])
        {
            jill_high = &v[i]; //保存最大元素的地址
            h = v[i]; //更新"最大元素"
         }

double* high(double* first, double* last)
//返回一个指针,指向最大元素
{
    double h = -1;
    double* high;
    for(double* p = first; p!=last; ++p)
        if (h<*p) {high = p; h = *p;}
    return high;
}

double* jack_high = high(jack_data, jack_data+jack_count);
vector<double>& v = *jill_data;
double* jill_high = high(&v[0], &v[0]+v.size());


STL理念

C++标准库为处理数据程序序列提供了一个专门的框架,称为STL。
STL是标准模板库(Standard Template Library)的简称。
它提供了容器(例如vector,list,和map)和通用算法(例如sort,find和accumulate)。


序列和迭代器

从STL的角度来看,数据集合就是一个序列。序列具有头部和尾部。
迭代器(iterator)是一种可以标识序列中元素的对象。


那么究竟什么是迭代器呢?迭代器是一个相当抽象的概念:
迭代器指向序列中的某个元素。
可以使用==和!=来对两个迭代器进行比较。
可以使用单目运算符*来访问迭代器所指向的元素。
可以利用操作符++来令迭代器指向下一个元素。

许多迭代器不仅仅是指针。

STL框架包含大概10中容器和60种有迭代器相连接的算法。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值