Професионална програма
Loading...
+ Нов въпрос
Smeshan avatar Smeshan 76 Точки

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 332 Точки

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

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 76 Точки

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

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

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

0