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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2017, 16:30   #1
AntonCH
Пользователь
 
Регистрация: 28.11.2017
Сообщений: 58
По умолчанию Диапазон итераторов для добавления в список

Реализовать групповое добавление, удаление и замена элементов. Группа представляется диапазоном итераторов. Реализовать методы поиска элементов и групп элементов.
Написал простое добавление элемента, как прикрутить сюда итераторы?
Код:
// TemplateList.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"

using namespace std;
#include <iostream>
#include <conio.h>  
#include <ctype.h> 
#include <windows.h>


template<typename T>
struct Link {
	T data;
	Link* next;
};

template<typename T>
class List {
	Link<T>* first;
public:
	List() :first(nullptr) {};
	List(const List<T>& Source);
	~List() {
		Link<T> *current = first;
		while (current != nullptr) {
			Link<T>* temp = current;
			current = current->next;
			delete temp;
		}
			}
	void Add(T Data);
	void Show();
	template <typename T> friend void ShowA(List<T>& list);
	template <typename T> friend void AddA(List<T>& list, T Data);
};





template<typename T>
List<T>::List(const List<T>& Source)
{
	Link<T> *temp = Source->first;
	Link<T> *A,*B = NULL;
	

	while (temp != NULL) 
	{
		A = new Link<T>;
		A->data = temp->data;
		if (B != NULL)
			B->next = &A;
		else
			first = &A;
		B = &A;
		temp = temp->next;
	}
}


template<typename T>
void List<T>::Add(T Data)
{
	Link<T> *temp = first;
	Link<T> *NewNode = new Link<T>;

	if(temp != NULL)
		while (temp->next != NULL) temp = temp->next;

	NewNode->data = Data;
	NewNode->next = NULL;
	if (temp != NULL)
		temp->next = NewNode;
	else
		first = NewNode;
}


template<typename T>
void List<T>::Show()
{
	Link<T> *temp = first;
	while (temp != NULL) {
		cout << (T)temp->data << endl;
		temp = temp->next;
	}
}

template <typename T>
void ShowA(List<T>& list)
{
	list.Show();
}

template <typename T>
void AddA(List<T>& list, T Data)
{
	list.Add(Data);
}

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	List<int> Test;
	AddA(Test, 3);
	AddA(Test, 4);
	cout << "данные"<<endl;
	ShowA(Test);
	_getch();
	return 0;
}
AntonCH вне форума Ответить с цитированием
Старый 01.12.2017, 16:41   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Как написано по условию. Например, упрощенное добавление - создаете функцию, которая принимает два итератора и в цикле пока не дошли до второго add, std::next
p51x вне форума Ответить с цитированием
Старый 01.12.2017, 17:17   #3
AntonCH
Пользователь
 
Регистрация: 28.11.2017
Сообщений: 58
По умолчанию

Как объявить итератор для моего класса?
List<int>::iterator it;
AntonCH вне форума Ответить с цитированием
Старый 01.12.2017, 17:36   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Можете и так... Может быть вы не знаете, что это такое и зачем?
p51x вне форума Ответить с цитированием
Старый 01.12.2017, 17:45   #5
AntonCH
Пользователь
 
Регистрация: 28.11.2017
Сообщений: 58
По умолчанию

Ну мне кажется это что то типа массива ссылок на элементы. Я так понял для класса не входящего в STL итератор нужно реализовывать? List<int>::iterator it;
Подобное объявление не проходит. Пишет List не содержит члена iterator

Последний раз редактировалось AntonCH; 01.12.2017 в 17:57.
AntonCH вне форума Ответить с цитированием
Старый 01.12.2017, 17:54   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Т.е. вы думаете, что в контейнере лежит один массив с данными и еще один с ссылками? Погуглите чтоль...
p51x вне форума Ответить с цитированием
Старый 01.12.2017, 18:03   #7
AntonCH
Пользователь
 
Регистрация: 28.11.2017
Сообщений: 58
По умолчанию

Дак погуглил. Внятного объяснения нигде нет.
AntonCH вне форума Ответить с цитированием
Старый 01.12.2017, 18:17   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Странно. Даже в русской вики более-менее сносно сказано, что такое итератор. А если загуглить c++ iterator, то на первой странице и описание, и методы, и примеры реализаций... Вы не из Китая там пишите?
p51x вне форума Ответить с цитированием
Старый 02.12.2017, 14:13   #9
AntonCH
Пользователь
 
Регистрация: 28.11.2017
Сообщений: 58
По умолчанию

Вставил реализацию итератора в класс. Возникла проблема как написать функцию для обращения к данным.
Код:
// TemplateList.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"

using namespace std;
#include <iostream>
#include <conio.h>  
#include <ctype.h> 
#include <windows.h>
#include <iterator>

template<typename T>
struct Link {
	T data;
	Link* next;
};

template<typename T>
class List {
	Link<T>* first;
public:
	List() :first(nullptr) {};
	List(const List<T>& Source);
	~List() {
		Link<T> *current = first;
		while (current != nullptr) {
			Link<T>* temp = current;
			current = current->next;
			delete temp;
		}
			}
	void Add(T Data);
	void Show();
	template <typename T> friend void ShowA(List<T>& list);
	template <typename T> friend void AddA(List<T>& list, T Data);
	class Iterator {
	private:
		Link<T>* current;
	public:
		explicit Iterator(Link<T> *first) : current(first) {

		}

		Iterator operator + (int n) const {
			while (current->next != NULL && n-- > 0)
				current = current->next;
				
			return Iterator(current);
		}

		Iterator operator++(int) {
			Iterator tmp(current->next);
			return tmp;
		}

		bool operator==(const Iterator &it) const {
			return current == it.current;
		}

		bool operator!=(const Iterator &it) const {
			return !(*this == it);
		}

		Link<T> &operator*() {
			return *current;
		}
		const Link<T> &operator*() const {
			return *current;
		}

	};
	Iterator begin() { return first; }
	Iterator end(){
		Link<T>* temp = first;
		while (temp->next != NULL) temp = temp->next;
		return temp;
	}
};





template<typename T>
List<T>::List(const List<T>& Source)
{
	Link<T> *temp = Source->first;
	Link<T> *A,*B = NULL;
	

	while (temp != NULL) 
	{
		A = new Link<T>;
		A->data = temp->data;
		if (B != NULL)
			B->next = &A;
		else
			first = &A;
		B = &A;
		temp = temp->next;
	}
}


template<typename T>
void List<T>::Add(T Data)
{
	Link<T> *temp = first;
	Link<T> *NewNode = new Link<T>;

	if(temp != NULL)
		while (temp->next != NULL) temp = temp->next;

	NewNode->data = Data;
	NewNode->next = NULL;
	if (temp != NULL)
		temp->next = NewNode;
	else
		first = NewNode;
}


template<typename T>
void List<T>::Show()
{
	Link<T> *temp = first;
	while (temp != NULL) {
		cout << (T)temp->data << endl;
		temp = temp->next;
	}
}

template <typename T>
void ShowA(List<T>& list)
{
	list.Show();
}

template <typename T>
void AddA(List<T>& list, T Data)
{
	list.Add(Data);
}

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	List<int> Test;
	AddA(Test, 3);
	AddA(Test, 4);
	AddA(Test, 5);
	AddA(Test, 6);
	AddA(Test, 7);
	AddA(Test, 8);
	AddA(Test, 9);
	AddA(Test, 10);
	AddA(Test, 11);
	AddA(Test, 12);
	cout << "данные"<<endl;
	ShowA(Test);

	auto a = Test.begin();

while (a != Test.end()) { cout << &a->data; }
	_getch();
	return 0;
}
AntonCH вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация итераторов для своего контейнера Aoizora Общие вопросы C/C++ 0 20.05.2017 22:40
выпадающий список по фильтру с возможностью добавления Grief192 Microsoft Office Access 0 18.11.2013 07:31
Выпадающий список+диапазон Lyuda_! Microsoft Office Excel 2 24.11.2011 23:47
Снять/защитить диапазон с учетом добавления строк dzv Microsoft Office Excel 8 08.02.2010 10:29
Краткий список в нужный диапазон Иванов_ДМ Microsoft Office Excel 10 28.07.2009 22:05