以下、Boost 1.43.0 beta1で検証しています。
まず、要素数が同じRange同士の比較
#include <cassert> #include <vector> #include <list> #include <boost/range/algorithm/equal.hpp> int main() { const std::vector<int> v = {1, 2, 3}; const std::list<int> ls = {1, 2, 3}; assert(boost::equal(v, ls)); // OK }
次に、要素数が異なるRange同士の比較。
std::equalにそのまま流してるだけだと問題。
#include <cassert> #include <vector> #include <list> #include <boost/range/algorithm/equal.hpp> int main() { const std::vector<int> v = {1, 2, 3}; const std::list<int> ls = {1, 2, 3, 4}; assert(!boost::equal(v, ls)); // OK }
大丈夫そう。
いちおう実装もみてますが、なんであんなめんどくさいことしてるのか。
(std/boost)::distanceとstd::equalを使って実装すれば一瞬でできるのに、わざわざタグディスパッチしてwhile文を使ったりして実装されています。
Boost 1.42.0までは<boost/detail/algorithm.hpp>に、equal等のRangeアルゴリズムのシンプルな実装があったのですが、Boost 1.43.0 beta1では<boost/range/algorithm/equal.hpp>で置き換えられていました。