C ++ STL算法相等

时间:2017-06-22 15:50:48

标签: 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;
}

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

为什么会这样?

3 个答案:

答案 0 :(得分:13)

假设您有一个std::list<int>std::vector<int>,并希望了解它们是否相同。如果std::equal没有使用不同的迭代器类型,则无法使用它,因为std::list<int>::iteratorstd::vector<int>::iterator的类型不同。

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:5)

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

例如:

Connection connect = connection.getConnection();     
String query = "UPDATEtable SET oderNumber = 1 WHERE number = 3";
PreparedStatement statement =connect.prepareStatement(query);
statement.executeUpdate();
statement.close();
Connection connect = connection.getConnection();
Stringquery = "UPDATE table SET oderNumber = 3 WHERE number = 1";
PreparedStatement statement = connect.prepareStatement(query); 
statement.executeUpdate();
statement.close();