当前位置:嗨网首页>书籍在线阅读

12-使用数组区间的函数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

7.3.4 使用数组区间的函数

正如您看到的,对于处理数组的C++函数,必须将数组中的数据种类、数组的起始位置和数组中元素数量提交给它;传统的C/C++方法是,将指向数组起始处的指针作为一个参数,将数组长度作为第二个参数(指针指出数组的位置和数据类型),这样便给函数提供了找到所有数据所需的信息。

还有另一种给函数提供所需信息的方法,即指定元素区间(range),这可以通过传递两个指针来完成:一个指针标识数组的开头,另一个指针标识数组的尾部。例如,C++标准模板库(STL,将在第16章介绍)将区间方法广义化了。STL方法使用“超尾”概念来指定区间。也就是说,对于数组而言,标识数组结尾的参数将是指向最后一个元素后面的指针。例如,假设有这样的声明:

double elboud[20];

则指针elboud和elboud + 20定义了区间。首先,数组名elboub指向第一个元素。表达式elboud + 19指向最后一个元素(即elboud[19]),因此,elboud + 20指向数组结尾后面的一个位置。将区间传递给函数将告诉函数应处理哪些元素。程序清单7.8对程序清单7.6做了修改,使用两个指针来指定区间。

程序清单7.8 arrfun4.cpp

// arrfun4.cpp -- functions with an array range
#include <iostream>
const int ArSize = 8;
int sum_arr(const int * begin, const int * end);
int main()
{
    using namespace std;
    int cookies[ArSize] = {1,2,4,8,16,32,64,128};
// some systems require preceding int with static to
// enable array initialization
    int sum = sum_arr(cookies, cookies + ArSize);
    cout << "Total cookies eaten: " << sum << endl;
    sum = sum_arr(cookies, cookies + 3); // first 3 elements
    cout << "First three eaters ate " << sum << " cookies.\n";
    sum = sum_arr(cookies + 4, cookies + 8); // last 4 elements
    cout << "Last four eaters ate " << sum << " cookies.\n";
    return 0;
}
// return the sum of an integer array
int sum_arr(const int * begin, const int * end)
{
    const int * pt;
    int total = 0;
    for (pt = begin; pt != end; pt++)
        total = total + *pt;
    return total;
}

下面是该程序的输出:

Total cookies eaten: 255
First three eaters ate 7 cookies.
Last four eaters ate 240 cookies.

程序说明

请注意程序清单7.8中sum_array()函数中的for循环:

for (pt = begin; pt != end; pt++)
    total = total + *pt;

它将pt设置为指向要处理的第一个元素(begin指向的元素)的指针,并将*pt(元素的值)加入到total中。然后,循环通过递增操作来更新pt,使之指向下一个元素。只要pt不等于end,这一过程就将继续下去。当pt等于end时,它将指向区间中最后一个元素后面的一个位置,此时循环将结束。

其次,请注意不同的函数调用是如何指定数组中不同的区间的:

int sum = sum_arr(cookies, cookies + ArSize);
...
sum = sum_arr(cookies, cookies + 3);      // first 3 elements
...
sum = sum_arr(cookies + 4, cookies + 8); // last 4 elements

指针cookies + ArSize指向最后一个元素后面的一个位置(数组有ArSize个元素,因此cookies[ArSize − 1]是最后一个元素,其地址为cookies + ArSize – 1)。因此,区间[cookies,cookies + ArSize]指定的是整个数组。同样,cookies,cookies + 3指定了前3个元素,依此类推。

请注意,根据指针减法规则,在sum_arr()中,表达式end – begin是一个整数值,等于数组的元素数目。

另外,必须按正确的顺序传递指针,因为这里的代码假定begin在前面,end在后面。