Skip to main content
Code Review

Return to Answer

replaced http://stackoverflow.com/ with https://stackoverflow.com/
Source Link

Following is my solution. It's much less code. It also handles the case of string literals correctly (e.g., is_palindrome("aba")).

In modern C++ (11 and onward), there is no need to differentiate predicate and non-predicate versions of generic algorithms. The fact that the standard library does overload predicate and non-predicate versions is simply due to historical reasons. See this this S.O. topic for details.

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}
template <std::size_t n, typename Pred = std::equal_to<void>>
bool is_palindrome(const char (&x)[n], Pred pred = Pred{}) {
 return is_palindrome(x, x + n - 1, std::move(pred));
}

Following is my solution. It's much less code. It also handles the case of string literals correctly (e.g., is_palindrome("aba")).

In modern C++ (11 and onward), there is no need to differentiate predicate and non-predicate versions of generic algorithms. The fact that the standard library does overload predicate and non-predicate versions is simply due to historical reasons. See this S.O. topic for details.

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}
template <std::size_t n, typename Pred = std::equal_to<void>>
bool is_palindrome(const char (&x)[n], Pred pred = Pred{}) {
 return is_palindrome(x, x + n - 1, std::move(pred));
}

Following is my solution. It's much less code. It also handles the case of string literals correctly (e.g., is_palindrome("aba")).

In modern C++ (11 and onward), there is no need to differentiate predicate and non-predicate versions of generic algorithms. The fact that the standard library does overload predicate and non-predicate versions is simply due to historical reasons. See this S.O. topic for details.

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}
template <std::size_t n, typename Pred = std::equal_to<void>>
bool is_palindrome(const char (&x)[n], Pred pred = Pred{}) {
 return is_palindrome(x, x + n - 1, std::move(pred));
}
added 331 characters in body
Source Link
Lingxi
  • 828
  • 7
  • 18

Following is my solution. It's much less code. It also handles the case of string literals correctly (e.g., is_palindrome("aba")).

In modern C++ (11 and onward), there is no need to differentiate predicate and non-predicate versions of generic algorithms. The fact that the standard library does overload predicate and non-predicate versions is simply due to historical reasons. See this S.O. topic for details.

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}
template <std::size_t n, typename Pred = std::equal_to<void>>
bool is_palindrome(const char (&x)[n], Pred pred = Pred{}) {
 return is_palindrome(x, x + n - 1, std::move(pred));
}

Following is my solution. It's much less code. It also handles the case of string literals correctly (e.g., is_palindrome("aba")).

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}
template <std::size_t n, typename Pred = std::equal_to<void>>
bool is_palindrome(const char (&x)[n], Pred pred = Pred{}) {
 return is_palindrome(x, x + n - 1, std::move(pred));
}

Following is my solution. It's much less code. It also handles the case of string literals correctly (e.g., is_palindrome("aba")).

In modern C++ (11 and onward), there is no need to differentiate predicate and non-predicate versions of generic algorithms. The fact that the standard library does overload predicate and non-predicate versions is simply due to historical reasons. See this S.O. topic for details.

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}
template <std::size_t n, typename Pred = std::equal_to<void>>
bool is_palindrome(const char (&x)[n], Pred pred = Pred{}) {
 return is_palindrome(x, x + n - 1, std::move(pred));
}
Fix flaw
Source Link
Lingxi
  • 828
  • 7
  • 18

Following is my solution. It's much less code. It also handles the case of string literals correctly (e.g., is_palindrome("aba")).

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}
template <std::size_t n, typename Pred = std::equal_to<void>>
bool is_palindrome(const char (&x)[n], Pred pred = Pred{}) {
 return is_palindrome(x, x + n - 1, std::move(pred));
}

Following is my solution. It's much less code.

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}

Following is my solution. It's much less code. It also handles the case of string literals correctly (e.g., is_palindrome("aba")).

#include <functional>
#include <iterator>
#include <utility>
template <typename Iterator, typename Pred = std::equal_to<void>>
bool is_palindrome(Iterator beg, Iterator end, Pred pred = Pred{}) {
 if (beg == end) return true;
 end = std::prev(end);
 if (beg == end) return true;
 do {
 if (! pred(*beg++, *end--)) return false;
 }
 while (beg != end && beg != std::next(end));
 return true;
}
template <typename T, typename Pred = std::equal_to<void>>
bool is_palindrome(const T& x, Pred pred = Pred{}) {
 return is_palindrome(std::begin(x), std::end(x), std::move(pred));
}
template <std::size_t n, typename Pred = std::equal_to<void>>
bool is_palindrome(const char (&x)[n], Pred pred = Pred{}) {
 return is_palindrome(x, x + n - 1, std::move(pred));
}
Source Link
Lingxi
  • 828
  • 7
  • 18
Loading
lang-cpp

AltStyle によって変換されたページ (->オリジナル) /