Loading...
Smeshan avatar Smeshan 89 Точки

Lab & Exercise: Stacks and Queues [all]

Здравейте, кръстих така темата, за да не спамя за всяка задача, а съм сигурен, че ще имам въпроси или чуденки. Надявам се това е ок, и тук да може дискутираме всички задачи от lab-a и упражнението.

Lab задачите тук.
Exercise задачите тук.

Първата задача, за която имам чуденки е 7. Hot Potato от Lab.
Написах това решение: https://pastebin.com/mYsAw5C4
Въпросите са ми следните:
1. Предполагам list трябва ползввам, но все пак той ли е?
2. Защо в setItToNextPos() не мога да напиша const пред std::list<std::string>& names. Нали нищо не правя с него.
3. За втория параметър std::list<std::string>::iterator it, има ли нужда да го правя const и по референция? Или итераторите бивайки число/адрес (доколкото разбирам) са достатъчно малки за да не ги? Или като цяло какви са правилата при подаване на итератор като параметър на функция?
4. (optional) Ще се радвам и на мнение за решението ми?

Благодаря предварително,
Илиян Павлов

Тагове:
0
C++ Advanced 28/05/2021 14:31:53
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, Илиян.

1)
Задачата ти изглежда вярна.
Малко си я over complicate-нал излишно.

2)
Според мен бъркаш функциите .remove() и .erase().
.remove(), която си използвал ти - обикаля целият контейнер и премахва елементите с подадената стойност.
Най-вероятно не искаш това.
Това, което търсиш е функцията .erase().
Тя приема итератор и много важно - връща итератор, която трябва да присвоиш.
Старият итератор вече е невалиден, затова трябва да присвоиш новия. Контейнера си се оправя вътрешно с останалатоа локига.
Когато искаш да триеш елемент докато итерираш се получава нещо такова

std::list<int> values { 1, 3, 5 };
//note that we don't increment the iterator in the for increment placeholder
for (std::list<int>::iterator it = values.begin(); it != values.end(); ) {
  if (*it == 3) { //the value we want to erase
    it = values.erase(it);
  } else {
    ++it; //normal iteration
  }
}

3)
Относно подаването на итератор като параметър на функция...не е невъзможно, но е странно.
Според мен можеш да разкараш функцията setItToNextPos и да замениш кода
it = setItToNextPos(names, it);
със

++it.
if (it == names.end()) {
  it = names.begin();
}

4)
Относно въпроса ти защо не можеш да направиш листа константен във функцията:
Можеш, без проблем. Просто върху константен лист можеш да имаш само const_iterator-и.
Твоите не са const и затова ти ръмжи компилаторът.

Поздрави,
Живко

0
28/05/2021 22:31:37
Smeshan avatar Smeshan 89 Точки

Ех, изобщо не съм съобразил да проверя за remove() и erase().
Сега стана 10 пъти по-лесно https://pastebin.com/dhs0nAEf

Но поне завинаги научих разликата между двете и упражниш итераторите.

Благодаря и поздрави,
Илиян

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