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

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

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

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

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

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

Как реализовать дружественную функцию, которая принимает диапазон итераторов и список и добавляет данные из диапазона в список. Проблема - как передать итераторы в функцию? Пробовал ставить тип Link<T>::Iterator - ошибка.
Код:
#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 {
            Link<T>* temp = current;
            while (temp->next != NULL && n-- > 0)
                temp = temp->next;
                
            return Iterator(temp);
        }
 
        Iterator operator++(int) {
            Link<T>* temp = current;
            return Iterator(temp->next);
        }
 
        bool operator==(const Iterator &it) const {
            return current == it.current;
        }
 
        bool operator!=(const Iterator &it) const {
            return !(*this == it);
        }
 
        T &operator*() {
            return current->data;
        }
        const Link<T> &operator*() const {
            return *current;
        }
 
    };
    Iterator begin() { return Iterator(first); }
    Iterator end(){
        Link<T>* temp = first;
        while (temp->next != NULL) temp = temp->next;
        return Iterator(temp);
    }
    template <typename T> friend void AddIt(List<T>& list, Iterator first, Iterator end);
 
};
 
 
 
 
 
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);
}
 
 
template <typename T>
void AddIt(List<T>& list, Link<T>::Iterator first, Link<T>::Iterator end)
{
    Link<T> *temp = first;
 
    while (first != end)
    {
        list.Add(*first);
        first = first + 1;
    }
    list.Add(*first);
}
 
 
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();
    auto b = a + 4;
    while (a != Test.end()) {
        cout<< "while" << *a << endl;
        a = a + 1;
         }
    List<int> Test2;
    cout << "++++++++++++++++++++++++++++" << endl;
    AddIt(Test2, a, b);
 
    Test2.Show();
    _getch();
    return 0;
}
AntonCH вне форума Ответить с цитированием
Старый 02.12.2017, 17:52   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

http://www.programmersforum.ru/showthread.php?t=315011
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диапазон итераторов для добавления в список AntonCH Помощь студентам 8 02.12.2017 14:13
Добавление в таблицу диапазона чисел yulia Microsoft Office Access 0 24.12.2015 15:39
Добавление смежного диапазона. KemanSR Microsoft Office Excel 14 15.02.2013 17:59
Добавление в список. С++ vadmaruschak Помощь студентам 2 18.11.2012 12:37
Добавление в список, С++ Stiker Помощь студентам 3 28.05.2011 21:36