2013-06-07 4 views

ответ

12

Вы можете просто сказать a == v, или, возможно, a.size() == v.size() && a == v. Это так же эффективно, как может быть. (Последняя форма с проверкой явного размера может быть лучше, потому что набор итераторы не с произвольным доступом). Обновление: Проверка размера подразумевается

+0

Я бы смутился, сказав, что 'a == b' так же быстро и эффективно, насколько это возможно или не может делать лишних сравнений за кулисами. Не зная реализации, вы не можете сказать, что это «самый быстрый». –

+0

@ RichardJ.RossIII: Но мы знаем реализацию, поскольку она указана. –

+0

Я думал, что сама реализация не указана, только поведение, правильно? Различные реализации STL могут отличаться. –

5

Вы, вероятно, ссылаясь на std::equal overload принимая 3 [спасибо @juanchopanza!] итераторы и дополнительный предикат. Так просто оставьте второй конец, так как он не интерпретируется как конечный итератор, а предикат, который дрянь:

std::equal(a.begin(), a.end(), v.begin()) 

Но Марк ammends в своем комментарии в этом случае вы должны сделать убедитесь, что оба размера контейнера совпадают заранее, в противном случае вы рискуете бежать в конце второго набора. Обратите внимание, что C++ 14 действительно представит перегрузку std::equal с четырьмя итераторами (это то, что вы намеревались) и которое будет заведомо проверять размер, но кажется, что ваша реализация еще не поддерживает это.

Кроме этого, другие ответы и комментарии верны в том, что a == v намного проще, понятнее и обтекаемо.

+0

Обратите внимание, что если вы используете 'std :: equal', вам также нужно будет проверить сначала, если контейнеры имеют одинаковый размер, иначе вы можете сбежать с конца второго. –

+0

@MarkRansom Да, действительно. –

Смежные вопросы