C++容器和迭代器

    xiaoxiao2022-06-24  205

    模板

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

    容器和迭代器

    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)