Вот чистое решение C ++ 11, которое должно работать для любого последовательного контейнера (например, std::vector
, std::list
, std::deque
).Он использует собственный тип возвращаемого значения, так как тип сравнения, который вы показываете в исходных фрагментах, содержит больше информации, чем может содержать простое логическое значение.
enum class CombinedCompareResult {
NotEqual, EqualAndFirstLarger, EqualAndSecondLarger, EqualIncludingSize
};
template <class Rng1, class Rng2>
CombinedCompareResult combinedCompare(const Rng1& rng1, const Rng2& rng2)
{
using std::begin;
const auto elementsToCompare = std::min(rng1.size(), rng2.size());
if (!std::equal(begin(rng1), std::next(begin(rng1), elementsToCompare), begin(rng2)))
return CombinedCompareResult::NotEqual;
else if (rng1.size() == rng2.size())
return CombinedCompareResult::EqualIncludingSize;
else if (rng1.size() > rng2.size())
return CombinedCompareResult::EqualAndFirstLarger;
else
return CombinedCompareResult::EqualAndSecondLarger;
}
Это может быть использовано, как показано ниже, и должно привести кповедение, идентичное коду в вопросе.
const auto cmp = combinedCompare(lst, a);
if (cmp == CombinedCompareResult::EqualIncludingSize)
std::cout << "Same a = a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndFirstLarger)
std::cout << "Same a gt a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndSecondLarger)
std::cout << "Same a1 gt a" << std::endl;