【问题标题】:C++ STL algorithm equalC++ STL 算法相等
【发布时间】:2017-06-22 15:50:48
【问题描述】:

一个特别有用的标准算法是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;
}

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

这是为什么?

【问题讨论】:

  • 例如,您可能想比较不同容器中的内容。

标签: c++ algorithm stl equals


【解决方案1】:

假设您有一个 std::list&lt;int&gt;std::vector&lt;int&gt; 并想看看它们是否相等。如果std::equal 没有采用不同的迭代器类型,您将无法使用它,因为std::list&lt;int&gt;::iteratorstd::vector&lt;int&gt;::iterator 的类型不同。

这也适用于相同的容器类型但存储不同的元素。 std::vector&lt;int&gt;::iteratorstd::vector&lt;long long&gt;::iterator 不同,因此如果两个迭代器对使用相同的类型,您也无法比较它们。

【讨论】:

  • 可以容纳的不仅仅是不同的容器 - 你可以比较例如vector&lt;int&gt;vector&lt;double&gt;
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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



    例如:

    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
    */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多