一个特别有用的标准算法是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
并返回范围内的元素是否相等。请注意,该算法在两种不同类型的输入迭代器上进行模板化。
为什么会这样?
答案 0 :(得分:13)
假设您有一个std::list<int>
和std::vector<int>
,并希望了解它们是否相同。如果std::equal
没有使用不同的迭代器类型,则无法使用它,因为std::list<int>::iterator
与std::vector<int>::iterator
的类型不同。
这也适用于相同的容器类型,但存储不同的元素。 std::vector<int>::iterator
与std::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();