C ++ STL алгоритм равен

Один особенно полезный стандартный алгоритм 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)) и возвращает, равны ли элементы в диапазоне. Обратите внимание, что алгоритм шаблонизируется для двух разных типов входных итераторов.

Почему это?

8

Решение

Допустим, у вас есть 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 и поэтому вы не сможете сравнить их, если он использует один и тот же тип для обеих пар итераторов.

12

Другие решения

До сих пор вы получили два ответа, которые сосредоточены на контейнерах. Это неправильный фокус. Основная абстракция данных в STL — это последовательность. Последовательность определяется парой итераторов. Контейнеры являются одним из способов управления последовательностями, но они не являются единственными. Итак, чтобы дать право <g> ответ:

std::equal сравнивает две последовательности на равенство. Нет веских оснований ограничивать применение алгоритма последовательностями, имеющими один и тот же тип итератора, поэтому такого ограничения нет. Последовательности могут иметь различное происхождение и могут ссылаться на разные типы значений.

Например, вы можете проверить, идентичны ли значения, представленные в файле, который содержит текстовое представление двойных значений, содержимому вектора целых чисел, хранящегося в памяти. Вектор определяет последовательность; вы можете получить на его итераторы с begin() а также end(), Файл определяет последовательность; вы можете получить его итераторы, открыв файл с ifstream и создание пары istream_iterator<double> объекты. std::equal (и все остальные стандартные алгоритмы) будут прекрасно работать с этими разнородными источниками данных и их различными типами данных.

8

Это шаблонизируется таким образом, что вы можете передавать либо два итератора одного типа, либо два итератора разных типов.

Например:

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
*/
5
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector