似て非なる関数をうっかり使い間違えて,どつぼにはまらないようにメモします。

equalはSTL、<algorithm>のstd::equal、equalsはBoostのstring_algo、<boost/algorithm/string/predicate.hpp>のboost::algorithm::equalsです。

最初、引数の取り方が違うだけで中身は同じかと思ったら、見事、予想は外れました。一言で言えばstring_algoでは長さも一致しないと真になりません。

#include <iostream>
#include <string>
#include <algorithm>
#include <boost/algorithm/string/predicate.hpp>
 
int main()
{
  namespace algo = boost::algorithm;
  using std::cout;
 
  std::string s1 = "あいうえお";
  std::string s2 = s1;
  std::string s3 = s1 + "かきくけこ";
 
  bool stl_equal_1_2 = std::equal(s1.begin(), s1.end(), s2.begin());
  bool stl_equal_1_3 = std::equal(s1.begin(), s1.end(), s3.begin());
 
  bool algo_equals_1_2 = algo::equals(s1, s2);
  bool algo_equals_1_3 = algo::equals(s1, s3);
 
  cout << "\t1=2\t1=3\n";
  cout << std::boolalpha << "STL:\t" << stl_equal_1_2 << '\t' << stl_equal_1_3 << '\n';
  cout << std::boolalpha << "Algo:\t" << algo_equals_1_2 << '\t' << algo_equal_1_3 << '\n';
  cout << std::flush;
}

結果はこうです。完全に同一なs1とs2では、どっちでも真になりますが、1と3の比較ではstring_algoが偽となります。

        1=2     1=3
STL:    true    true
Algo:   true    false

STLのほうは先に指定したほうの範囲内で後に指定したイテレータの各要素と一致するなら真、string_algoは指定した2つの範囲が一致するなら真。言葉にするとこんな感じでしょうか。下手に日本語で書くよりプログラムとその出力を見たほうが一目瞭然ですね、こりゃ。

ちなみにstring_algoには、アルファベットの大文字小文字を区別しないiequalsがあります。またequal/equals共に比較関数を引数に取る版もあります。


スポンサード リンク

この記事のカテゴリ

  • ⇒ equalとequals