Есть несколько возможностей, в зависимости от того, хотите ли вы это поведение:
- раз
- закодировано в классе
Если вы хотите вести себя один раз: просто используйте свой собственный (пользовательский) алгоритм:
bool isSpace(char i) { return i == '-' or i == ' '; }
int compare(std::string const& left, std::string const& right) {
typedef std::string::const_iterator ConstIterator;
typedef std::pair<ConstIterator, ConstIterator> Result;
size_t const size = std::min(left.size(), right.size());
Result const r = std::mismatch(left.begin(),
left.begin() + size,
right.begin(),
[](char a, char b) {
return a == b or (isSpace(a) and isSpace(b));
});
if (r.first == left.begin() + size) { // equal up til the end, shorter wins
return left.size() < right.size() ? -1 :
(left.size() == right.size() ? 0 : 1);
}
// not equal until the end
return *r.first < *r.second ? -1 : 1;
}
Если это поведение необходимо кодировать внутри самого класса, вам нужно использовать basic_string
и предоставить пользовательский класс черты.
Класс черт предоставляет функцию static int compare ( const char_type* s1, const char_type* s2, size_t n);
, которая используется std::string::compare
под капотом.
Так, например:
struct MyTraits: char_traits<char> // too lazy to reimplement everything
{
static int compare(const char_type* s1, const char_type* s2, size_t n);
// definition can be trivially derived from the above version
};
typedef std::basic_string<char, MyTraits> MyString;
Конечно, MyString
тогда совершенно несовместим с другими std::string
.
Честно говоря, если можете, просто "нормализуйте" свою строку и решите, будете ли вы использовать '-' или ''. Это облегчит вашу жизнь.