首页 > 试题广场 >

【例1】 只读算法equal,用于确定两个序列是否保存

[问答题]

【例1

只读算法equal,用于确定两个序列是否保存相同的值。它将第一个序列中的每个元素与第二个序列中的对应元素进行比较。如果所有对应元素都相等,则返回true,否则返回false。此算法接受三个迭代器:前两个(与以往一样)表示第一个序列中的元素范围,第三个表示第二个序列的首元素:

//roster2中的元素数目应该至少与roster1一样多

equal (roster1.cbegin(), roster1.cend(), roster2.cbegin())

由于equal利用迭代器完成操作,因此我们可以通过调用equal来比较两个不同类型的容器中的元素。而且,元素类型也不必一样,只要我们能用==来比较两个元素类型即可。例如,在此例中,roster1可以是vector<string>,而roster2list<cons char*>

但是,equal基于一个非常重要的假设:它假定第二个序列至少与第一个序列一样长。此算法要处理第一个序列中的每个元素,它假定每个元素在第二个序列中都有一个与之对应的元素。


(1)在【例1】对名册(roster)调用equal的例子中,如果两个名册中保存的都是C风格字符串而不是string,会发生什么?

推荐

【出题思路】

理解equal如何比较元素。

【解答】

equal使用==运算符比较两个序列中的元素。string类重载了==,可比较两个字符串是否长度相等且其中元素对位相等。而C风格字符串本质是char*类型,用==比较两个char*对象,只是检查两个指针值是否相等,即地址是否相等,而不会比较其中字符是否相同。所以,只有当两个序列中的指针都指向相同的地址时;

equal才会返回true。否则,即使字符串内容完全相同,也会返回false

如下面的程序,q中的每个字符串是p中字符串的拷贝,虽然内容相同,但是不同对象指向不同地址,因此equal判定它们不等。而r中每个指针都是p中指针的拷贝,指向相同的地址,因此equal判定它们相等。

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int main (int argc, char *argv [])
{
char *p[] = { "Hello","World", "!" };
char *q[] = { strdup (p[0]), strdup (p[1]),strdup (p[2]) };
char *r[] = { p[0], p[1], p[2] };
cout << equal (begin(p), end(p), q)<< endl;
cout << equal (begin(p), end(p), r)<< endl;
return 0;
}


发表于 2018-07-30 20:06:58 回复(0)