Я хочу сравнить два набора, используя алгоритм equal
, но это дает мне ошибку. Как можно узнать, равны ли два набора или нет?Как эффективно сравнивать наборы в C++?
if(equal (a.begin(), a.end(), v.begin(), v.end())
Я хочу сравнить два набора, используя алгоритм equal
, но это дает мне ошибку. Как можно узнать, равны ли два набора или нет?Как эффективно сравнивать наборы в C++?
if(equal (a.begin(), a.end(), v.begin(), v.end())
Вы можете просто сказать a == v
, или, возможно, . Это так же эффективно, как может быть. a.size() == v.size() && a == v
(Последняя форма с проверкой явного размера может быть лучше, потому что набор итераторы не с произвольным доступом). Обновление: Проверка размера подразумевается
Я бы смутился, сказав, что 'a == b' так же быстро и эффективно, насколько это возможно или не может делать лишних сравнений за кулисами. Не зная реализации, вы не можете сказать, что это «самый быстрый». –
@ RichardJ.RossIII: Но мы знаем реализацию, поскольку она указана. –
Я думал, что сама реализация не указана, только поведение, правильно? Различные реализации STL могут отличаться. –
Вы, вероятно, ссылаясь на std::equal
overload принимая 3 [спасибо @juanchopanza!] итераторы и дополнительный предикат. Так просто оставьте второй конец, так как он не интерпретируется как конечный итератор, а предикат, который дрянь:
std::equal(a.begin(), a.end(), v.begin())
Но Марк ammends в своем комментарии в этом случае вы должны сделать убедитесь, что оба размера контейнера совпадают заранее, в противном случае вы рискуете бежать в конце второго набора. Обратите внимание, что C++ 14 действительно представит перегрузку std::equal
с четырьмя итераторами (это то, что вы намеревались) и которое будет заведомо проверять размер, но кажется, что ваша реализация еще не поддерживает это.
Кроме этого, другие ответы и комментарии верны в том, что a == v
намного проще, понятнее и обтекаемо.
Обратите внимание, что если вы используете 'std :: equal', вам также нужно будет проверить сначала, если контейнеры имеют одинаковый размер, иначе вы можете сбежать с конца второго. –
@MarkRansom Да, действительно. –
Вы попробовали 'a == v'? –