JA1-Task-2-Array-Sum
Някой има ли идея как да се реши 2-рата задача от JA без да се използва двумерен масив или емулация на такъв (то доколкото знам и без това в Cpp многомерните се емулират)? Проблема ми е, че има неизвестен брой масиви, които трябва да се създадат, като този брой се взима от конзолата и не виждам как ще дефинирам масиви arr1,... arrN.
Идеята ти е емулация на многомерен масив с тези групи от елементи с брой колони във вектор с дължина редове * колони. Благодаря, и аз така си ги представях нещата, но понеже в условието е казано да се съзадат масиви arr1, ..., arrN реших, т.е. динамично създаване на масиви с имена идващи от променливи, че може би аз съм пропуснал нещо някъде из лекцията.
И да питам още - в тази задача размера на масива е ясен - M x N и мога директно да си декларирам масив (както и правя в моето решение). Решението може да стане и както предлагаш ти - с вектор. В такива ситуации, когато и са приложими и масиви и вектори (то тези ситуации са винаги, когато са приложими масиви) кое е за предпочитане да се използва?
Краткият отговор, за нашите цели в този курс - няма смисъл да ползваш масив, по-лесно е с vector.
Дългият отговор е... ами, дълъг :D
Векторът ползва и позволява неща, които може да не ти се налага реално в задачата, която решаваш. Като за начало, векторът винаги проверява дали достъпваш правилен индекс - ако не достъпваш хвърля т.нар. exception, който сигнализира на програмата ти, че нещо не е наред и я прекратява (освен ако не го catch-неш, но това е извън тематиката на този курс) - това означава, че ако много на брой пъти достъпваш индекс във вектор, това е по-бавно от да го правиш с масив, защото масивът я няма тази проверка (за сметка на това трябва да си сигурен, че достъпваш правилен индекс). Също, векторът за да може да добавя елементи ефикасно си пази допълнителна памет (двойно на това, което му трябва, всеки път когато му потрябва нова памет). Тоест - обикновено - вектор с 5 елемента ще заеме място за 8 (вектор с 4 елемента ще си заеме точно пространството), вектор с 9 елемента ще заеме място за 16 и т.н. - това почва да става проблем когато стигнеш примерно до 1025 елемента, в който случай ще ползваш памет за 2048. Има го и момента, че когато подаваш вектор като параметър, му се прави копие (всеки елемент се копира, освен ако не го подадеш по референция), докато масивът винаги си пристига по референция. Отделно, че когато ползваш масив, за някой четящ кода ти е ясно, че намерението ти е да ползваш точно толкова на брой елементи, както и че този масив няма да се return-ва и т.н. - ако ползваш вектор, четящият кода ти трябва да прочете целия код, за да му стане ясно това. Така че кое ще ползваш зависи от ситуацията, от задачата и т.н.
Като цяло в C++ (че и в програмирането като цяло) много често въпроси от порядъка на "кое от двете е по-добре да се ползва" ще имат отговор "зависи какви са ти целите", или "едното е по-добро за тази ситуация, другото е по-добро за тази ситуация" - просто езикът е направен да има много възможности и начини да се постигне едно и също на пръв поглед нещо. Съответно за да вземеш най-доброто решение трябва да познаваш и двата варианта добре и да знаеш кой какво прави добре и какво не - оттам нататък прилагаш тези знания към условията в които се намиреш за да решиш кое да ползваш.