Loading...
zzerro avatar zzerro 16 Точки

Range-based for loop

Здравейте!

В няколко задачи в различни курсове по С++ срещам проблем с динамичнa промяна на границата на range-based цикъл. Въпросът е как да овърлоуднем end() метода на контейнера вътре в цикъла? Задачите са от този тип:

template<typename T>
class ContainerClass
{
public:
	typename std::vector<T>::iterator begin()
	{
		return _v.begin();
	}

	typename std::vector<T>::iterator end()
	{
		return _v.end(); //не става така
	}

	void add(T a)
	{
		_v.push_back(a);
	}

private:
	std::vector<T> _v;
};

int main()
{
	ContainerClass<int> c;
	
	c.add(1);
	c.add(2); 

	for (auto e : c)
	{
		std::cout << e << std::endl;
		
		if(input())
			c.add(3);
	}

	return 0;
}

 

Тагове:
0
C++ OOP
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, колега,

Функциите begin() и end() които си направил са вярни в общия случай.
Има обаче нещо друго. Ти се мъчиш да направиш нещо, което е next level.
Да модифицираш контейнера докато го итерарираш.

	for (auto e : c)
	{
		std::cout << e << std::endl;
		
		if(input())
			c.add(3);
	}

В момента, в който направиш това имаш undefined behaviour в STL container-ите. В случая std::vector.

Как може да избягаш от ситуацията?
Вместо begin() и end() функциите на класа ти Container да извикват директно STL container-а - трябва там да върнеш собствен обект (Итератор за класа ти Container), с който можеш да имплементираш range based foor loop.

Операторите, които трябва да поддържа този обект са:
- operator++
- operator!=
- operator*

Това ще ти позволи ти да имплементираш как ще се изпълни range based for loop-а вместо да разчиташ директно на std::vector и без да предизвикваш undefined behaviour.

Поздрави

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