«Если я не ошибаюсь, он будет работать со всеми стандартными контейнерами»
Весь вопрос сводится к тому, в какой реализации? Вы хотите написать код в соответствии со стандартом или кодировать детали реализации компилятора, который у вас есть сегодня? Если последнее, то, если все ваши тесты пройдены, я думаю, что это работает.
Если вы спрашиваете о языке программирования C ++, то qsort
требуется для работы только с типами POD. Если вы спрашиваете о конкретной реализации, какой? Если вы спрашиваете обо всех реализациях, то вы упустили свой шанс, поскольку лучшим местом для такого рода опросов были встречи рабочей группы C ++ 0x, так как они собрали представителей практически каждой организации с активно поддерживаемая реализация C ++.
Что бы это ни стоило, я могу довольно легко представить реализацию std::list
, в которой узел списка встроен в сам объект списка и используется в качестве сторожа головы / хвоста. Я не знаю, какие реализации (если таковые имеются) на самом деле это делают, поскольку также часто используется нулевой указатель в качестве начального / хвостового стража, но, безусловно, есть некоторые преимущества для реализации двусвязного списка с фиктивным узлом на каждом конец. Экземпляр такого std::list
, конечно, не будет тривиально подвижным, поскольку узлы для его первого и последнего элементов больше не будут указывать на страж. Его реализация swap
и (в C ++ 0x) его конструктор перемещения будут учитывать это, обновляя эти первый и последний узлы.
Ничто не мешает вашему компилятору переключиться на эту реализацию std::list
в следующем выпуске, хотя это нарушит бинарную совместимость, поэтому, учитывая то, как управляется большинство компиляторов, это должен быть основной выпуск.
Аналогично, квартет map / set / multimap / multiset может иметь узлы, которые указывают на их родителей. Итераторы отладки для любого контейнера могут содержать указатель на контейнер. Чтобы сделать то, что вы хотите, вы должны (по крайней мере) исключить существование какого-либо указателя на контейнер в любой части его реализации, и такой быстрый вывод, как «ни одна реализация не использует ни одного из этих приемов», является довольно неразумным. Весь смысл наличия стандарта состоит в том, чтобы делать заявления обо всех соответствующих реализациях, поэтому, если вы не сделали вывод из стандарта, то даже если ваше утверждение верно сегодня, оно может стать неверным завтра.