fork download
  1. #include <algorithm>
  2. #include <cctype>
  3. #include <cassert>
  4. #include <set>
  5. #include <string>
  6.  
  7. struct icase_less {
  8. bool operator()(const std::string& x, const std::string& y) const {
  9. // для однобайтных кодировок без учёта диграфов типа эсцета - сойдёт
  10. return std::lexicographical_compare(
  11. std::begin(x), std::end(x),
  12. std::begin(y), std::end(y),
  13. [](char a, char b)->bool { return std::toupper(a) < std::toupper(b); } );
  14. }
  15. };
  16.  
  17. template<class LESS>
  18. struct dependent_equal {
  19. LESS less;
  20. template<class X, class Y>
  21. bool operator()(X&& x, Y&& y) const {
  22. return !less(std::forward<X>(x), std::forward<Y>(y))
  23. && !less(std::forward<Y>(y), std::forward<X>(x));
  24. }
  25. };
  26.  
  27. int main() {
  28. using icase_multiset = std::multiset<std::string, icase_less>;
  29. icase_multiset xx = { "alfa", "beta", "Beta", "BETA", "gamma" };
  30. icase_multiset yy = { "alfa", "Beta", "BETA", "BeTa", "gamma" };
  31. // <--------------------> класс эквивалентности "beta"
  32.  
  33. using icase_equal = dependent_equal<icase_less>;
  34. // выполняем попарное сравнение
  35. assert( std::equal(std::begin(xx), std::end(xx),
  36. std::begin(yy), std::end(yy),
  37. icase_equal()));
  38. // попарное сравнение без "без учёта регистра" не прокатит
  39. assert(!std::equal(std::begin(xx), std::end(xx),
  40. std::begin(yy), std::end(yy)));
  41. }
  42.  
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
Standard output is empty