1

Тема: Що краще std::copy чи звичайний цикл?

Скажімо, я використав set, щоб прибрати всі копії, а потім мені треба перенести все до vector.
Що краще використати для цього std::copy чи звичайний цикл?

2 Востаннє редагувалося steamwater (07.01.2025 10:42:15)

Re: Що краще std::copy чи звичайний цикл?

Teg Miles, звернiть увагу на конструктор 5 https://en.cppreference.com/w/cpp/conta … tor/vector
Але якщо у векторi зарезервувати пам'ять заздалегiдь, а потiм скопiювати то може бути краще.

Подякували: Teg Miles, leofun012

3

Re: Що краще std::copy чи звичайний цикл?

steamwater написав:

Teg Miles, звернiть увагу на конструктор 5 https://en.cppreference.com/w/cpp/conta … tor/vector

Тобто std::copy просто переносить вказівники на ітератори з одного контейнера в інший?

4 Востаннє редагувалося steamwater (07.01.2025 11:03:15)

Re: Що краще std::copy чи звичайний цикл?

Teg Miles написав:
steamwater написав:

Teg Miles, звернiть увагу на конструктор 5 https://en.cppreference.com/w/cpp/conta … tor/vector

Тобто std::copy просто переносить вказівники на ітератори з одного контейнера в інший?

Нi. У нього є рiзнi спецiалiзацiї. Щодо iтераторiв - вiн копує з iтератора до iтератора, чи навiть переносить (див.https://en.cppreference.com/w/cpp/itera … e_iterator). Останнє, власне є теж копiюванням, але конструктором пересування. Така поведiнка не є властивiвiстью, саме std::copy. Так працюють i iншi алгоритми std/stl. Це властивiсть саме iтераторiв як таких. Серед них є багато типiв, але для початку, дивiться на них як на свого роду вказiвники. Тобто по них можна читати, писати (не по всiх видах, але поки це не вожливо).
Тобто, std::copy разiменовує кожен iтератор контейнера-джерела i копує значення цiльового об'єкту до разiменованого iтератора контейнера-цiлi. Попарно. Потiм iнкрементує обох.

Подякували: Teg Miles1

5

Re: Що краще std::copy чи звичайний цикл?

Краще за яким саме критерієм?
Ну і так, є конструктор.

6

Re: Що краще std::copy чи звичайний цикл?

koala написав:

Краще за яким саме критерієм?
Ну і так, є конструктор.

Краще щодо швидкості й обсягу пам'яті, що використовується при цьому.

7 Востаннє редагувалося steamwater (07.01.2025 14:11:42)

Re: Що краще std::copy чи звичайний цикл?

Teg Miles написав:
koala написав:

Краще за яким саме критерієм?
Ну і так, є конструктор.

Краще щодо швидкості й обсягу пам'яті, що використовується при цьому.

Ви маєте std::set. Тобто його розмiр ви знаєте, тож зарезервуйте у векторi мiсце, та скопуйте той сет з початку до кiнця у початок вектора.
Хочу ще звернути увагу на те, що алгоритми не мають посилання на контейнери, а працюють саме з їх iтераторам. Тож просте використання reserve не прокатить. I ще одна цiкава рiч. Може трапитись перетворення типiв. Це зручно, але треба бути уважним:

std::vector<int> veci = { 1, 2, 3 };
for(auto el:veci) std::cout << el << ' ';
std::cout << '\n';
std::vector<double> vecd;
vecd.resize(veci.size()); // можна було с початку використати конструктора std::vector(n) замiсть цього), бо iнiцiалiзацiї по замовчуванню не уникнути, хоч там як)) 
std::copy(veci.begin(), veci.end(), vecd.begin());
for(auto el:vecd) std::cout << el << ' ';

тому конструктор може бути швидкiшим, бо при добрiй реалiзацiї вектора, може не викликати ланцюг замовчувальних конструкторiв.

8

Re: Що краще std::copy чи звичайний цикл?

Teg Miles написав:
koala написав:

Краще за яким саме критерієм?
Ну і так, є конструктор.

Краще щодо швидкості й обсягу пам'яті, що використовується при цьому.

Все ніяк не збагну, чому вас так мучить питання швидкості, чи що краще.. Ніщо не краще, не існує срібної кулі. Ви намагаєтесь порівнювати якісь абстрактні речі у вакуумі. Якщо ви підходите до питання оптимізацій, то це комплексна задача, від аналізу даних до фактичних замірів на конкретному залізі.

P.S. Якщо не певні у якомусь стандартному алгоритмі – не використовуйте його, краще напишіть самі, циклом. Як мінімум точно будете розуміти, що там відбувається.

Подякували: koala, leofun012

9 Востаннє редагувалося steamwater (07.01.2025 13:07:08)

Re: Що краще std::copy чи звичайний цикл?

wander написав:

Все ніяк не збагну, чому вас так мучить питання швидкості, чи що краще..

Людина знайомиться з алгоритмами i бажає взнати як воно там вiдбувається.

10

Re: Що краще std::copy чи звичайний цикл?

steamwater написав:
wander написав:

Все ніяк не збагну, чому вас так мучить питання швидкості, чи що краще..

Людина знайомиться з алгоритмами i бажає взнати як воно там вiдбувається.

Людина страждає двома хворобами початківця: бажанням одразу робити все ідеально та небажанням самостійно досліджувати питання. Вбивча комбінація, але колись воно мине... у той чи інший спосіб.

11

Re: Що краще std::copy чи звичайний цикл?

У початкiвця є багато труднощiв, про якi ми вже забули i нездатнi їх побачити. Тобто форум для того й iснує. А враховуючи, що ТС чи не єдиний збуджувач спокою, то й поготiв) Менi, особисте, прикро згадувати як ми холодно сприняли його спробу використати count_if. А вона була добра. До того ж то був крок до std, що не менш важливо. Та й зараз, питання досить цiкаве. Я потiм поясню думку.

12

Re: Що краще std::copy чи звичайний цикл?

Це не труднощі початківця, це аби-який підхід до навчання. Бачу перші теми (тут на форумі) автора по С++ з 2018 року.. Та й це питання далеке від "знайомства з алгоритмами", а питань штибу "що краще" точно вже кілька штук було на форумі від ТСа. Іноді бездіяльність краще за ведмежу послугу.

Подякували: koala1

13

Re: Що краще std::copy чи звичайний цикл?

wander написав:

Це не труднощі початківця, це аби-який підхід до навчання. Бачу перші теми (тут на форумі) автора по С++ з 2018 року.. Та й це питання далеке від "знайомства з алгоритмами", а питань штибу "що краще" точно вже кілька штук було на форумі від ТСа. Іноді бездіяльність краще за ведмежу послугу.

Я далекий вiд того, щоб квалiфiкувате, що це, а що не це. Можу лише визназничити, що намагання застосувати iнструмент до того моменту як прийшло розумiння як вiн працює, змiнилося на бажання взнати як вiн працює. Це крок у вiрному напрямi. А щодо самостiйних эксперементiв, то воно с часом прийде. Головне те що є зацiкавлення.