Заменить std :: sort на boost :: sort

Я хотел бы заменить std :: sort на boost :: sort, чтобы сравнить производительность между ними. Коллега порекомендовал мне создать разделяемую библиотеку с переопределением std :: sort, которая вызывает boost: sort, а затем просто использовать LD_PRELOAD, чтобы ввести новую разделяемую библиотеку, и, следовательно, переопределить std: sort. Будет ли это работать? Если это так, может кто-нибудь опубликовать пример того, как заменить функцию STL?

1

Решение

Подтвердить Нил Кирк претензии, мы можем взглянуть на boost/range/algorithm/sort.hpp заголовок. А также range::sort на самом деле реализуется с точки зрения std::sort,

template<class RandomAccessRange>
inline RandomAccessRange& sort(RandomAccessRange& rng)
{
BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<RandomAccessRange> ));
std::sort(boost::begin(rng), boost::end(rng));
return rng;
}

/// \overload
template<class RandomAccessRange>
inline const RandomAccessRange& sort(const RandomAccessRange& rng)
{
BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<const RandomAccessRange> ));
std::sort(boost::begin(rng), boost::end(rng));
return rng;
}

/// \overload
template<class RandomAccessRange, class BinaryPredicate>
inline RandomAccessRange& sort(RandomAccessRange& rng, BinaryPredicate pred)
{
BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<RandomAccessRange> ));
std::sort(boost::begin(rng), boost::end(rng), pred);
return rng;
}

/// \overload
template<class RandomAccessRange, class BinaryPredicate>
inline const RandomAccessRange& sort(const RandomAccessRange& rng, BinaryPredicate pred)
{
BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessRangeConcept<const RandomAccessRange> ));
std::sort(boost::begin(rng), boost::end(rng), pred);
return rng;
}

Так что нет смысла делать это. Страница для range::sort также перечисляет сложность, которая отражает сложность для std::sort:

Источник: повышение

O (N log (N)) сравнений (как среднего, так и наихудшего случая), где N
Расстояние (RNG).

Источник: cppreference

O (N · log (N)), где N = std :: distance (first, last) сравнений на
средний. (до C ++ 11)

O (N · log (N)), где N = std :: расстояние (первое, последнее) сравнения. (поскольку
С ++ 11)

4

Другие решения


По вопросам рекламы [email protected]