只读算法
accumulate
假设 vec 是一个 int 型的 vector 对象,下面的代码:
// sum the elements in vec starting the summation with the value 42
int sum = accumulate(vec.begin(), vec.end(), 42);
将 sum 设置为 vec 的元素之和再加上 42。accumulate 带有三个形参。头两个形参指定要累加的元素范围。第三个形参则是累加的初值。accumulate 函数将它的一个内部变量设置为指定的初值,然后在此初值上累加输入范围 accumulate
用于指定累加起始值的第三个实参是必要的,因为 accumulate 对将要累加的元素类型一无所知,因此,除此之外,没有别的办法创建合适的起始值或者关联的类型。
accumulate 对要累加的元素类型一无所知,这个事实有两层含义。首先,调用该函数时必须传递一个起始值,否则,accumulate 将不知道使用什么起始值。其次,容器内的元素类型必须与第三个实参的类型匹配,或者可转换为第三个实参的类型。在 accumulate 内部,第三个实参用作累加的起点;容器内的元素按顺序连续累加到总和之中。因此,必须能够将元素类型加到总和类型上。
考虑下面的例子,可以使用 accumulate 把 string 型的 vector 容器中的元素连接起来:
// concatenate elements from v and store in sum
string sum = accumulate(v.begin(), v.end(), string(""));
但是传递一个字符串字面值,将会导致编译时错误。因为此时,累加和的类型将是 const char*,const char*并没有定义+运算,故而上述代码将发生编译错误。
find_first_of 的使用
这个算法带有两对迭代器参数来标记两段元素范围,在第一段范围内查找与第二段范围中任意元素匹配的元素,然后返回一个迭代器,指向第一个匹配的元素。如果找不到元素,则返回第一个范围的 end 迭代器。假设 roster1 和 roster2 是两个存放名字的 list 对象,可使用 find_first_of 统计有多少个名字同时出现在这两个列表中:
// program for illustration purposes only:
// there are much faster ways to solve this problem
size_t cnt = 0;
list<string>::iterator it = roster1.begin();
// look in roster1 for any name also in roster2
while ((it = find_first_of(it, roster1.end(),
roster2.begin(), roster2.end()))
!= roster1.end()) {
++cnt;
// we got a match, increment it to look in the rest of roster1
++it;
}
cout << "Found " << cnt
<< " names on both rosters" << endl;
调用 find_first_of 查找 roster2 中的每个元素是否与第一个范围内的元素匹配,也就是在 it 到 roster1.end() 范围内查找一个元素。该函数返回此范围内第一个同时存在于第二个范围中的元素。
循环条件检查 find_first_of 的返回值,判断是否找到匹配的名字。如果找到一个匹配,则使计数器加 1,同时给 it 加 1,使它指向 roster1 中的下一个元素。很明显可知,当不再有任何匹配时,find_first_of 返回 roster1.end(),完成统计。
该函数调用的输入范围由 it 和调用 roster1.end() 返回的迭代器指定。算法要求用于指定范围的两个迭代器必须具有完全一样的类型。roster1.end()返回的迭代器依赖于 roster1 的类型。如果该容器是 const 对象,则返回的迭代器是 const_iterator 类型;否则,就是普通的 iterator 类型。在这个程序中,roster1 不是 const 对象,因而 end 返回的只是一个普通的迭代器。如果我们将 it 定义为 const_iterator,那么 find_first_of 的调用将无法编译。用来指定范围的两个迭代器的类型不相同。it 是 const_iterator 类型的对象,而 rotser1.end() 返回的则是一个 iterator 对象。

浙公网安备 33010602011771号