C++ STL算法相等

Tik*_*ung 9 c++ algorithm stl equals

一种特别有用的标准算法std::equal,定义如下:

template <typename InputIterator1, typename InputIterator2>
inline bool equal(InputIterator1 start1,
InputIterator1 end1,
InputIterator2 start2)
{
    while(start1 != end1)
    {
        if(*start1 != *start2) return false;
        ++start1;
        ++start2;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

该算法遍历由[start1, end1)and 定义的范围, [start2, start2 + (end1 – start1))并返回该范围内的元素是否相等.请注意,该算法在两种不同类型的输入迭代器上进行了模板化.

为什么是这样?

Nat*_*ica 13

让我们说你有一个std::list<int>并且std::vector<int>想要看看它们是否相等.如果std::equal没有采用不同的迭代器类型,则无法使用它,因为std::list<int>::iterator它的类型不同std::vector<int>::iterator.

这也适用于相同的容器类型,但存储不同的元素.A std::vector<int>::iterator与a不同std::vector<long long>::iterator,因此如果它对两个迭代器对使用相同的类型,则无法比较它们.


Pet*_*ker 9

到目前为止,你已经得到了两个专注于容器的答案.这是错误的焦点.STL中的基本数据抽象是序列.序列由一对迭代器定义.容器是管理序列的一种方式,但它们不是唯一的方法.那么,给出正确的 <g>答案:

std::equal比较两个序列是否相等.没有充分的理由将算法的应用限制为具有相同迭代器类型的序列,因此没有这样的限制.序列可以具有不同的来源,并且可以指代不同的值类型.

例如,您可能想要检查包含double值的文本表示的文件中表示的值是否与存储在内存中的整数向量的内容相同.矢量定义了一个序列; 你可以使用begin()和得到它的迭代器end().该文件定义了一个序列; 您可以通过打开文件ifstream并创建一对istream_iterator<double>对象来获取其迭代器.std::equal(以及所有其他标准算法)可以很好地处理这些不同的数据源及其不同的数据类型.


Viv*_*ick 5

它以这种方式模板化,因此您可以传递相同类型的两个迭代器或两个具有不同类型的迭代器.



例如:

vector<int> a; //some stuff
list<int> b; //some stuff
equal(a.begin(), a.end(), b.begin());
/*
Here InputIterator1 is a vector<int>::iterator
and InputIterator2 is a list<int>::iterator
*/

vector<double> c; //some stuff
vector<double> d; //some stuff
equal(c.begin(), c.end(), d.begin());
/*
Here InputIterator1 is a vector<double>::iterator
and InputIterator2 is also a vector<double>::iterator
*/
Run Code Online (Sandbox Code Playgroud)