Редактировать : Обратите внимание, что Решение Стива Таунсенда на самом деле именно то, что вы ищете, поскольку он в качестве C ++ 0x Lambda пишет то, что я пишу как C++ 03 код ниже.
Другим решением было бы настроить функцию заказа std::set
:
std::set
уже заказан ...
std::set
имеет свой собственный порядок, и вы не должны изменять его после его создания.Итак, следующий код:
int main(int argc, char* argv[])
{
std::set<std::string> aSet ;
aSet.insert("aaaaa") ;
aSet.insert("bbbbb") ;
aSet.insert("ccccccc") ;
aSet.insert("ddddddd") ;
aSet.insert("e") ;
aSet.insert("f") ;
outputSet(aSet) ;
return 0 ;
}
выведет следующий результат:
- aaaaa
- bbbbb
- ccccccc
- ddddddd
- e
- f
... Но вы можете настроить его функцию упорядочения
Теперь, если выхотите, вы можете настроить свой набор, используя собственную функцию сравнения:
struct MyStringLengthCompare
{
bool operator () (const std::string & p_lhs, const std::string & p_rhs)
{
const size_t lhsLength = p_lhs.length() ;
const size_t rhsLength = p_rhs.length() ;
if(lhsLength == rhsLength)
{
return (p_lhs < p_rhs) ; // when two strings have the same
// length, defaults to the normal
// string comparison
}
return (lhsLength < rhsLength) ; // compares with the length
}
} ;
В этом функторе сравнения я рассматривал случай "одинаковой длины, но разное содержимое означает разные строки", потому что я считаю,(возможно, неправильно), что поведение в исходной программе является ошибкой.Чтобы кодирование поведения было выполнено в исходной программе, удалите блок if
из кода.
И теперь вы создаете набор:
int main(int argc, char* argv[])
{
std::set<std::string, MyStringLengthCompare> aSet ;
aSet.insert("aaaaa") ;
aSet.insert("bbbbb") ;
aSet.insert("ccccccc") ;
aSet.insert("ddddddd") ;
aSet.insert("e") ;
aSet.insert("f") ;
outputSet(aSet) ;
return 0 ;
}
Набор будеттеперь используйте функтор MyStringLengthCompare
, чтобы упорядочить свои элементы, и, таким образом, этот код выведет:
- e
- f
- aaaaa
- bbbbb
- ccccccc
- ddddddd
Но остерегайтесь ошибки упорядочения!
Когда вы создаете свою собственную функцию упорядочения,оно должно следовать следующему правилу:
вернуть true, если (lhs
Если по какой-то причине ваша функция упорядочения не соблюдает ееу вас будет сломанный набор на руках.