C++ advanced Task 3 - Order
Здравейте,
В main() се създава обект от тип OrderedInserter с празния вектор:
vector<const Company*> companies; OrderedInserter inserter{ companies };
//CHECK-а ми (вкаран в четящия входни данни цикъл) работи и принти подредени възходящо обектите (така съм разписала класа):
cout << inserter.getInfo() << endl;
но, за извеждането на резултата, в main() се обхожда companies, който е празен и само инициализира обекта в кода.
Как да се изведат обектите, като ако пипна main(), системата ще го презапише?
Благодаря.
Благодаря!
Между другото, още в едно нещо се оказа прав. За начинът по който работят мозъците ни:-) Не веднъж ми се случва на сутринта да реша задачата "от раз!" :-)
По втория въпрос: тогава каква ни е гаранцията, че елементите на вектора ще са последователни в паметта?
А ако създадем по същия начин масив от елементи?
Поздрави!
Елементите на един вектор винаги са последователни в паметта, защото под вектора реално има скрит масив. Но мисля, че това което всъщност искаш да питаш е, "каква е гаранцията, че Company обектите са последователни в паметта, щом се заделят поотделно" - отговорът е: никаква, и не ни трябва тази гаранция.
Във вектора нямаме Company обекти - имаме указатели към Company обекти (Company*). Тоест на последователни места в паметта, сме записали адресите на други места в паметта.
Все едно ако аз в една тетрадка напиша на последователни редове адресите (град, улица, етаж...) на всички студенти в курса. Редовете текст, които съм написал, са едно след друго в пространството, обаче самите апартаменти/къщи, за които се отнасят, изобщо не са "последователни" в пространството. Затова ако искам накрая на програмата да изгоря къщите на всички студенти (не че имам такива желания :D), трябва да погледна всеки един адрес в тетрадката, да отида на него физически, и да изгоря самото място - for (Company* companyPtr : companies) { delete companyPtr; }, а не да изгоря самата тетрадка (грешно -
delete companies;)Ако обаче companies беше масив от елементи, динамично заделен така:
int numCompanies = 10; Company* companies = new Company[numCompanies];
Тогава да, самите Company обекти ще са последователни в паметта, като companies[0] ще е първият, companies[1] вторият и т.н. - това е все едно се хващаме да построим една улица с къщи и да настаним всички студенти от курса в тях - тогава адресите на студентите наистина ще са "последователни" в пространството. Случая с вектора пък е все едно им строим къщите по различни времена и си ги записваме в една тетрадка, и понеже ги строим по различни времена, местоположенията им не са последователни.
Надявам се, че всъщност това да питаше, ама ако не - питай пак :D
Поздрави,
Жоро