Я не уверен в коэффициенте полезного действия, но я использовал что-то подобное следующему, если Вы не настроены против использования ArrayList:
private ArrayList ShuffleArrayList(ArrayList source)
{
ArrayList sortedList = new ArrayList();
Random generator = new Random();
while (source.Count > 0)
{
int position = generator.Next(source.Count);
sortedList.Add(source[position]);
source.RemoveAt(position);
}
return sortedList;
}
Используя это, Вы не должны волноваться о промежуточном свопинге.
Реализации используют имена, начинающиеся с символа подчеркивания, за которым следует прописная буква или два символа подчеркивания, чтобы избежать конфликтов с пользовательскими макросами. Такие имена зарезервированы в C ++.
Например, можно определить макрос с именем Type
, а затем #include
. Если реализации вектора
использовали Тип
в качестве имени параметра шаблона, он сломался бы.
Однако нельзя определять макросы с именем _Type
(или __ type
, type __
и т. Д.). Следовательно, вектор
может безопасно использовать такие имена.
Многие реализации STL также включают проверку отладочных сборок, например, проверку того, что два итератора принадлежат одному и тому же контейнеру при их сравнении, и наблюдение за итераторами, выходящими за границы. Это включает довольно сложный код для отслеживания контейнера и достоверности каждого созданного итератора, но неоценим для поиска ошибок. Этот код также полностью переплетен со стандартным кодом выпуска с помощью #ifdefs - даже в алгоритмах STL. Так что никогда не будет так ясно, как их самая основная операция. Такие сайты, как , этот , демонстрируют базовую функциональность алгоритмов STL, заявляя, что их функциональность «эквивалентна» коду, который они показывают. Однако вы не увидите этого в своих заголовочных файлах.