模板
泛型编程: 编写能够正确处理以参数形式呈现的各种类型的代码, 只要这些参数类型满足特定的语法和语义要求。
容器和迭代器
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种有迭代器相连接的算法。