Вы собираетесь получить много строк, это наверняка...
\sum_ {i=x} ^y {\\frac {r!} {{(r-i)}! }} http://www.codecogs.com/eq.latex?%5Csum_%7Bi=x%7D%5Ey%20%7B%20%5Cfrac%7Br!%7D%7B%7B (r-i) %7D! %7D%20%7D
, Где, X и Y - то, как Вы определяете их, и r является количеством символов, которые мы выбираем из - если я понимаю Вас правильно. Необходимо определенно генерировать их по мере необходимости и не стать неаккуратными и сказать, генерировать степенное множество и затем отфильтровать длину строк.
следующим определенно не является лучший способ генерировать их, но это - интересное в стороне, тем не менее.
Knuth (объем 4, гроздь 2, 7.2.1.3) говорит нам, что (s, t) - комбинация эквивалентна s+1 вещам взятый t за один раз с повторением - (s, t) - комбинация является нотацией, используемой Knuth, который равен {t \choose {s+t} http://www.codecogs.com/eq.latex?%7Bt%20%5Cchoose%20%7Bs+t%7D%7D . Мы можем понять это первой генерацией каждого (s, t) - комбинация в двоичной форме (так, длины (s+t)) и подсчет количества 0 налево от каждого 1.
10001000011101-> становится перестановкой: {0, 3, 4, 4, 4, 1}
Мне никогда не приходилось использовать версию STL, кроме той, которая была упакована вместе с компилятором. Но вот некоторые моменты, которые приходят мне в голову.
basic_string
, основанная на COW (копирование при записи) и версии STL, которая поставляемый с вашим компилятором, не предлагает этого. hash_map
(и связанные) версии от Dinkumware (который поставляется с Visual Studio) имеют дизайн, значительно отличающийся от hash_map
(и связанных) от STLPort . Иногда я использую STLPort вместо STL, который поставляется с Visual Studio. Раньше, когда VC6 поддерживался, поставляемый с ним STL был с ошибками, и поэтому использование STLPort (или другого STL) имело большой смысл (особенно если вы создавали многопоточный код).
Теперь это часто больше о производительности (размере или скорости). Например, STL, поставляемый с VS2008, не так удобен в многопоточной ситуации, поскольку он использует блокировку вокруг объектов локали, что вызывает вещи, которые вы не ожидаете синхронизировать между потоками.
I've never had a need to use an alternative STL, but I could envision some scenarios where it might be useful to use, for example, the Apache version, if you need small executables because you're developing for an embedded platform.
Another reason might be to use an STL version that guarantees certain things which are not necessarily guaranteed by the standard. For example, to ensure you have non-COW strings so you can write thread-safe code.
STLport имеет то, что они называют «режимом мощной отладки», который выполняет множество проверок во время выполнения на «правильность использования итераторов и контейнеров». Помогает отловить ряд ошибок, которые не сразу бросаются в глаза. Я настоятельно рекомендую использовать STLport при отладке и тестировании.
Третьи стороны могут реализовать улучшенные версии STL, которые пытаются предложить различные вещи, такие как меньший размер, более быстрое выполнение и т. Д. Вы можете выбрать одну из этих альтернативных реализаций, потому что вам нужен один из этих атрибутов их реализации. Вы также можете выбрать один из них при кроссплатформенной разработке, потому что вы хотите избежать различий в поведении между версиями gcc и Visual Studio вашего продукта (как только один пример).
Нет необходимости ждать новый выпуск компилятора с объединенной реализацией STL, чтобы получить его новую реализацию, если у вас есть особые потребности.
Стандартная библиотека C ++ может быть реализована различными способами. Некоторые разработчики пытаются справиться с современными идеями. Таким образом, использование оптимизированной реализации может привести к более быстрым и меньшим по размеру исполняемым файлам.
Возьмем, к примеру, SCARY . Некоторые разработчики этого еще не сделали, хотя это в значительной степени снижает раздувание STL. Если вы сделаете следующее:
vector<int> f;
vector<int, MyAllocator> s;
size_t fc = count(f.begin(), f.end(), SomeValue);
size_t sc = count(s.begin(), s.end(), SomeOtherValue);
«Старая» реализация может создать две разные функции count
в исполняемом файле результата, потому что тип f
не такой, как у ] s
. Это потому, что тип итератора зависит от типа самого вектора, хотя это не обязательно. Лучше всего выделить тип итератора в отдельный класс, и предоставит typedef
в векторе
, и компилятор выдаст только один счетчик
. Это был всего лишь пример, но я думаю, что есть еще кое-что, что можно сказать о качестве некоторых реализаций.
Aside from the reasons already given, I could imagine using a different STL due to debugging support or as a way to guarantee I was not relying on vendor extensions.
It would also be a first step in testing whether a library I was shipping worked well on other platforms.
Люди, упоминающие STLport, указали на производительность и переносимость, но также доступен довольно хороший режим отладки . Я думаю, что это отличная причина использовать другой STL, если ваша текущая библиотека компилятора ограничена таким образом.
Ааи ... похоже, мы с Максом связались с упоминанием об отладке! ; ^) ~
Одна из причин - лучший поток - безопасность. Я использовал STL по умолчанию, который поставлялся с Visual Studio (на самом деле VC6), затем мне пришлось перейти на STLPort, поскольку он имел гораздо лучшую безопасность потоков.
We are currently using STLPort - external implementation of STL because we have to use (for various reasons) quite old Microsoft Visual C++ 6.0 compiler (1998 release date) and compiler supplied library (by Dimkunware) is of course very out of date.
Отладка упоминалась несколькими людьми с точки зрения возможности включения дополнительной диагностической информации, однако другой важный аспект заключается в том, что если вы используете собственный STL платформы, вы можете получить лучший опыт работы в отладчике. Это особенно верно, если вы используете Visual Studio, в которой есть визуализаторы для всех стандартных контейнеров.
STLPort поддерживает файлы размером более 2 ГБ через std :: fstreams. Visual Studio 2005/2008 не может обрабатывать файлы размером более 2 ГБ.
Вы можете протестировать свою реализацию STL, отобразив: std :: numeric_limits
И MSVC ++, и GNU g ++ поставляются с довольно хорошими реализациями стандартной библиотеки C ++, но есть компиляторы, которые этого не делают, и если бы мне пришлось поддерживать такие компиляторы, я бы поискал стороннюю реализация STL.