Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2017, 23:27   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Итератор для списка векторов

Пишу итератор для класса, который хранит элементы в списке векторов.


Код:
#include <iterator>


template <typename T> class VectorList;

template <typename ValueType>
class Iterator : public std::iterator<std::forward_iterator_tag, ValueType>
{
	friend class VectorList<ValueType>;
private:
	Iterator(typename std::list<std::vector<ValueType>>::iterator it);

public:
	Iterator(Iterator const& other);

	Iterator & operator++();
	typename Iterator::reference operator*() const;
	typename Iterator::pointer   operator->() const;
	bool operator!=(Iterator const& other) const;

private:
	typename std::list<std::vector<ValueType>>::iterator data;
};

template <typename ValueType>
Iterator<ValueType>::Iterator(typename std::list<std::vector<ValueType>>::iterator it)
	: data(it)
{

}

template <typename ValueType>
Iterator<ValueType>::Iterator(Iterator const& other)
	: data(other.data)
{

}

template <typename ValueType>
Iterator<ValueType> & Iterator<ValueType>::operator++()
{
	++data;
	return *this;
}

template <typename ValueType>
typename Iterator<ValueType>::reference Iterator<ValueType>::operator*() const
{
	return *data;
}

template <typename ValueType>
typename Iterator<ValueType>::pointer Iterator<ValueType>::operator->() const
{
	return &this->operator*();
}

template <typename ValueType>
bool Iterator<ValueType>::operator!=(Iterator const& other) const
{
	return data != other.data;
}

template<class T>
class VectorList
{
private:
	using VectT = std::vector<T>;
	using ListT = std::list<VectT>;

public:
	using value_type = T;
	using iterator       = Iterator<T>;
	using const_iterator = Iterator<const T>;

	VectorList() = default;
	VectorList(VectorList const &) = default;
	VectorList(VectorList &&) = default;

	VectorList & operator=(VectorList &&) = default;
	VectorList & operator=(VectorList const &) = default;

	template<class It>
	void append(It p, It q);

	bool empty() const { return size() == 0; }

	size_t size() const;

	iterator begin();
	iterator end();


private:
	ListT data_;
};

template <typename T>
template <typename It>
void VectorList<T>::append(It p, It q)
{
	if (p != q)
		data_.push_back(VectT(p, q));
}

template <typename T>
size_t VectorList<T>::size() const
{
	size_t ret = 0;
	for (const VectT& vect : data_)
	{
		ret += vect.size();
	}
	return ret;
}

template <typename T>
typename VectorList<T>::iterator VectorList<T>::begin()
{
	return Iterator(data_.begin());
}

template <typename T>
typename VectorList<T>::iterator VectorList<T>::end()
{
	return Iterator(data_.end());
}


int main()
{
	VectorList<int> vl;
	std::vector<int> a = { 1, 2, 3 };
	std::vector<int> b = { 4, 5, 6 };
	vl.append(a.begin(), a.end());
	vl.append(b.begin(), b.end());
	
	for (auto it : vl)
	{
		std::cout << it << ' ';
	}

	return 0;
}
Чтобы разобраться в том, как работает класс, достаточно разобраться в функции size().

Проблема в том, что я не понимаю, как создавать объект своего итератора в begin() и end() и что передавать в конструктор. Скорее всего, в конструктор итератора следует передать итератор begin() списка. В таком случае, как будет выглядеть параметр конструктора? Как в операторе ++ итерировать по всем элементам внутри VectorList?

Алгоритм работы итератора такой: он перебирает элементы всех векторов. Если вектор заканчивается, то происходит переход на следующий вектор.
Aoizora вне форума Ответить с цитированием
Старый 19.11.2017, 20:28   #2
СтудПом
Форумчанин
 
Регистрация: 08.11.2017
Сообщений: 347
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
в begin() и end()
-это не итераторы, а методы контейнера, которые возвращают значение-указатель для итератора.
Код:
for (ccontainer_iterator i=container.begin(); i!=container.end(); ++i) {
  проходим по элементам контейнера
}

Последний раз редактировалось СтудПом; 19.11.2017 в 20:31.
СтудПом вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
итератор для шаблонного класса mamohtOFF Помощь студентам 0 13.01.2017 12:16
Итератор списка RAFA91 Общие вопросы C/C++ 229 20.07.2016 18:11
Итератор для двусвязного списка Black_Dynamite Помощь студентам 0 07.11.2013 22:04
Итератор для класса. Orli Общие вопросы C/C++ 1 17.02.2012 20:53
Итератор списка по значению Link0 Общие вопросы по Java, Java SE, Kotlin 0 21.11.2010 14:02