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