Один особенно полезный стандартный алгоритм 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))
и возвращает, равны ли элементы в диапазоне. Обратите внимание, что алгоритм шаблонизируется для двух разных типов входных итераторов.
Почему это?
Допустим, у вас есть 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
и поэтому вы не сможете сравнить их, если он использует один и тот же тип для обеих пар итераторов.
До сих пор вы получили два ответа, которые сосредоточены на контейнерах. Это неправильный фокус. Основная абстракция данных в STL — это последовательность. Последовательность определяется парой итераторов. Контейнеры являются одним из способов управления последовательностями, но они не являются единственными. Итак, чтобы дать право <g> ответ:
std::equal
сравнивает две последовательности на равенство. Нет веских оснований ограничивать применение алгоритма последовательностями, имеющими один и тот же тип итератора, поэтому такого ограничения нет. Последовательности могут иметь различное происхождение и могут ссылаться на разные типы значений.
Например, вы можете проверить, идентичны ли значения, представленные в файле, который содержит текстовое представление двойных значений, содержимому вектора целых чисел, хранящегося в памяти. Вектор определяет последовательность; вы можете получить на его итераторы с begin()
а также end()
, Файл определяет последовательность; вы можете получить его итераторы, открыв файл с ifstream
и создание пары istream_iterator<double>
объекты. std::equal
(и все остальные стандартные алгоритмы) будут прекрасно работать с этими разнородными источниками данных и их различными типами данных.
Это шаблонизируется таким образом, что вы можете передавать либо два итератора одного типа, либо два итератора разных типов.
Например:
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
*/