Я ожидаю, что вы могли бы написать компаратор следующим образом:
struct LengthComparator {
bool operator()(const std::string &lhs, std::string::size_type rhs) {
return lhs.size() < rhs;
}
bool operator()(std::string::size_type lhs, const std::string &rhs) {
return lhs < rhs.size();
}
bool operator()(const std::string &lhs, const std::string &rhs) {
return lhs.size() < rhs.size();
}
};
Тогда используйте это:
std::equal_range(words.begin(), words.end(), length, LengthComparator());
Я ожидаю, что третья перегрузка operator()
никогда не используется, потому что предоставляемая информация избыточна. Диапазон должен быть предварительно отсортирован, поэтому бессмысленно, чтобы алгоритм сравнивал два элемента из диапазона, он должен сравнивать элементы из диапазона с поставляемой вами целью. Но стандарт не гарантирует этого. [Изменить: и определение всех трех означает, что вы можете использовать один и тот же класс компаратора, чтобы сначала упорядочить вектор, что может быть удобно].
Это работает для меня (gcc 4.3.4), и хотя я думаю, что это будет работать и для вашей реализации, я менее уверен, что это действительно допустимо. Он реализует сравнения, которые, как говорит описание equal_range
, будут верны для результата, и 25.3.3 / 1 не требует, чтобы параметр шаблона T
должен был точно соответствовать типу объектов, на которые ссылаются итераторы. Но, возможно, я пропустил какой-то текст, добавляющий больше ограничений, поэтому я бы сделал больше тралений стандартов перед тем, как использовать его в чем-то важном.