Loading...
MilushT avatar MilushT 1 Точки

C++advanced Task 2 Sort Pointers

Здравейте,

В тази задача на функцията, която трябва да се направи се подава един pointer to array of pointers+други 2. Това изглежда значи, че стандартната sort функция не може да се използва, защото на sort трябва да се подаде .begin() и .end() +критерия, а пък няма как да вземеш размера на array-a към който сочи пойнтера. Има ли някакъв начин на sort да се подаде "нещо" и тя да работи в този случай с пойнтера. Аз задачата я реших като си направих sort алгоритъм, но ми е интересно дали стандартния sort също би могъл да се използва. 

 

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей,

Да, тук идеята е да ползвате стандартната sort функция, като сложността е в това да прецените как да я извикате, защото comparator-а, който се подава, може да сравнява два Company обекта, докато данните, които трябва да бъдат сортирани, са Company* (тоест указатели към Company обекти).

Първите два параметъра, които получаваш, са началото и края (begin и end) за масива от Company* - тоест първите два параметъра, които подаваш на sort са същите първи два параметъра, които функцията ти получава.

Третият параметър е проблемен - не можеш да го подадеш директно, защото sort очаква друга сигнатура. Решението е да му подадеш ламбда, която има правилна сигнатура за comparator сравняващ два указателя към Company, и тази ламбда вътрешно да вика третия параметър като му подава дереференцирани двата си параметъра (защото третия параметър описва сравнението на два const Company&).

Поздрави,

Жоро

1
MartinBG avatar MartinBG 4803 Точки

Това беше доста интересна задача - поздравления! :)

Чудех дали съм подходил оптимално при решението ѝ и след този пост вече съм спокоен :)

1
marsp avatar marsp 19 Точки

Аз лично не подходих по този оптимален начин първоначално, но след като прочетох и имах време да разгледам как би се реализирало, съм доста впечатлен как буквало 1 ред от sort функция с ламбда решава цялата задача! Бях и подтикнат да се разчета за тея ламбди, тъй като в курсовете не сме се сблъсквали още детайлно. На когото му е интересно - това ми помогна на мен да схвана концепцията малко по-добре.

1
Jovanna avatar Jovanna 186 Точки

относно: "няма как да вземеш размера на array-a към който сочи пойнтера. "

Няма ли да стане, ако се извърти допълнителен цикъл 

int numObj = 0;

Company * i = *firstCompanyPtr;
 while (i != *lastCompanyPtr) {
       Company c = *i;      
       numOnj++;  
       i++;
  }

* Или: като имаме Company**firstCompanyPtr, Company** lastCompanyPtr

int numberOfCompanies = lastCompanyPtr - firstCompanyPtr;     ?

Поздрави!

0
23/09/2018 13:42:30
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Да, при наличие на указатели към началото и края на един масив, размерът му се определя от разликата между указателите. Вече в зависимост от това дали вторият указател сочи към последния елемент, или - както в стандартните библиотеки - до "позицията след" последния елемент, може да се наложи да се прави +1 (в първия случай, във втория не).

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.