Разложение натурального числа на простые множители

Почему выбран std::vector? Мне кажется, лучше взять std::map, где ключ — простое число в разложении, а значение — степень числа.
Ещё. Разве возвращать std::vector — не затратная операция? Мне кажется, лучше возвращать указатель, или передавать по ссылке в функцию std::vector для вывода результата туда?

porshe, если честно, про vector я думал меньше всего )) Просто мне нужна была некая структура данных нефиксированного размера для хранения результатов. vector или map — дело вкуса и/или удобства дальнейшего использования, как и возврат vector. К алгоритму факторизации это не относится.

Собственно говоря, данное «готовое решение» — это сам алгоритм факторизации, а способ хранения и/или возврата результата — рюшечки. Можно вообще сразу на консоль выводить ))

Разве возвращать std::vector — не затратная операция?

В данном случае будет NRVO, или, в крайнем случае, перемещение.

Тут ещё стоит принять во внимание, что даже если компилятором не будет делаться никаких оптимизаций, возвращаемый вектор будет сравнительно небольшого размера: для самого невыгодного случая 2^63 (больше в unsigned __int64 не поместится) — размер вектора 63 элемента — ерунда, даже если он будет честно копироваться.

Если же переключиться на арифметику произвольной длины (с помощью соответствующей библиотеки) и, допустим, попытаться «поломать» RSA-числа (надо сказать, с этим алгоритмом факторизации — занятие совершенно бесперспективное), то время на отыскание разложения перекроет время копирования вектора с бо-о-ольшим гаком.

Если рассматривать отвлечённо возврат вектора и передачу вектора в функцию по ссылке, то, спору нет, выгоднее работать со ссылкой. Опять-таки не учитывая оптимизацию.

porshe, меня заинтересовало твоё предложение "лучше возвращать указатель". Что ты имел ввиду?

Имел ввиду возвращать указатель на выделенную память под вектор внутри функции (или возвращать умный указатель).

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.