Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс List 
:(
    Опции темы
xvr
Дата 26.5.2017, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(шарлотта @  26.5.2017,  22:17 Найти цитируемый пост)
Не изменяет значения контейнера.

И не должен. Где какое нибудь присваивание?
Код

ForEach(list4.Begin(), list4.End(), 
        [](int& x) {
        x = x * 2;
    });


Копируется как обычные указатели. 
Код

template <class Iterator, class  Pred>
Iterator CopyIf(Iterator source_beg, Iterator source_end, Iterator& dest_beg, Pred pred) {
    for (; source_beg != source_end; ++source_beg) {
        if (pred(*source_beg)) {
            *dest_beg++ = *source_beg;
        }
    }
    return dest_beg;
}


Цитата

И алгоритм сортировки вообще не понимаю, как реализовать. Буду очень благодарна за помощь! 
Сделайте bubblesort. Это наиболее просто



PM MAIL   Вверх
шарлотта
Дата 26.5.2017, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Написала так:
Код

template <class Iterator, class Pred>
void ForEach(Iterator &beg, Iterator &end, Pred op) {
    for (; beg != end; ++beg) {
        op(*beg);// здесь возникает ошибка error C2664: "void main:<lambda_e26df0631702444a8e37b9682c990b52>::operator ()(int &) const": невозможно преобразовать аргумент 1 из "int" в "int &"
    }
}


Код

ForEach(list4.Begin(), list4.End(), 
        [](int &x) {
        x = x * 2;
    });



Код

template <class Iterator, class Pred>
Iterator CopyIf(Iterator source_beg, Iterator source_end, Iterator dest_beg, Pred pred) {
    for (; source_beg != source_end; ++source_beg) {
        if (pred(*source_beg)) {
            *dest_beg++ = *source_beg;//здесь ошибка error C2106: =: левый операнд должен быть левосторонним значением
        }
    }
    return dest_beg;
}


Код

List<int>::Iterator iter_copy = CopyIf(list4.Begin(), list4.End(), iter_copy,
        [](int x) {
        return x > 0 == 1;
    });


Не могу понять, в чем ошибки...

Это сообщение отредактировал(а) шарлотта - 27.5.2017, 00:36
PM MAIL   Вверх
шарлотта
Дата 27.5.2017, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



С первым разобралась, большое спасибо!
Во алгоритме CopyIf возникает ошибка
Код

template <class Iterator, class Pred>
Iterator CopyIf(Iterator source_beg, Iterator source_end, Iterator dest_beg, Pred pred) {
    for (; source_beg != source_end; ++source_beg) {
        if (pred(*source_beg)) {
            *dest_beg++ = *source_beg;// здесь на этапе выполнения программы  возникает ошибка Вызвано исключение: нарушение доступа для чтения.this->cur_pos было 0xCCCCCCCC.
        }
    }
    return dest_beg;
}


указывает на
Код

typename List<_DataType>::Iterator operator++(int) {
        List<_DataType>::Iterator iter2(*this);
        cur_pos = cur_pos->next;
        return iter2;
    }


Код

_DataType& operator*() {
        return cur_pos->data;
    }


Код

List<int>::Iterator iter_copy = CopyIf(list4.Begin(), list4.End(), iter_copy,
        [](int x) {
        return x > 0 == 1;
    });


Контейнер dest_beg пустой, и там не может быть выполнено ++. Но как исправить данную ошибку?

Это сообщение отредактировал(а) шарлотта - 27.5.2017, 22:58
PM MAIL   Вверх
volatile
Дата 28.5.2017, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(шарлотта @  27.5.2017,  16:19 Найти цитируемый пост)
Контейнер dest_beg пустой, и там не может быть выполнено ++. Но как исправить данную ошибку?

никак не надо исправлять. (можно исключение кинуть)
операция ++ над итератором указывающим на "end()" не имеет смысла, и должна вызывать исключение.


Это сообщение отредактировал(а) volatile - 28.5.2017, 10:09
PM MAIL   Вверх
шарлотта
Дата 28.5.2017, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Но как тогда сделать копирование?
Код

template <class Iterator, class Pred>
Iterator CopyIf(Iterator source_beg, Iterator source_end, Iterator& dest_beg, Pred pred) {
    for (; source_beg != source_end; ++source_beg) {
        if (pred(*source_beg)) {
            *dest_beg++ = *source_beg;
        }
    }
    return dest_beg;
}

Код

List<int>::Iterator iter_copy(iter4);
    std::cout << list4 << std::endl;
    List<int>::Iterator itercopy = CopyIf(list4.Begin(), list4.End(), iter_copy,
        [](int x) {
        return (x > 0) == 1;
    });

Если вызываю так, тоже выдает ошибку....
И мне кажется, так я совсем бред написала. Но как сделать правильно?
Не совсем понимаю, каким должен быть контейнер, куда копирую...


Вызвала так
Код

List<int> list1(7);
List<int>::Iterator iter_copy = list1.Begin();
    std::cout << list4 << std::endl;
    List<int>::Iterator itercopy = CopyIf(list4.Begin(), list4.End(), iter_copy,
        [](int x) {
        return (x > 0) == 1;
    });
    itercopy--;
    itercopy--;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;
    std::cout << *itercopy++ << std::endl;



Но, мне кажется, это бред полнейший...


А реализация сортировки еще более странная. Но не представляю, как сделать нормально...
Код

template <class Iterator>
void Sort(Iterator beg, Iterator end) {
    bool swapped = true;
    int j = 0, n = 0;
    Iterator tmp = beg;
    for (;  tmp!= end; ++tmp) {
        n++;
    }
    tmp = beg;
    while (swapped) {
        swapped = false;
        j++;
        for (int i = 0; beg != end && i < n - j; ++beg, i++) {
            if (*beg > *(++beg)) {
                tmp = beg;
                beg = ++beg;
                ++beg = tmp;
                swapped = true;
            }
        }
    }
}


Это сообщение отредактировал(а) шарлотта - 28.5.2017, 12:21
PM MAIL   Вверх
volatile
Дата 28.5.2017, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



шарлотта, у меня к вам другой вопрос. А как именно по-вашему должен работать ваш CopyIf()?
Не секрет, что весь этот ваш контейнер - это попытка собсственными силами написать часть STL
А std::copy из STL, именно так и работает.
т.е. он будет выкидывать исключение, если принимающий контейнер имеет меньший размер чем источник копирования.
посмотрите здесь я привел пример и комментарии: http://codepad.org/r3XR7b81

Видимо ваш алгоритм должен работать каким-то другим неведомым способом?

Ну дык приведите ТЗ, опишите словами что он должен делать, например для 3 случаев:
если src.size() == dst.size()
если src.size() < dst.size()
если src.size() > dst.size() // куда добавлять в конец, в начало, в середину, затирать ли имеющиеся?

А вот когда вы опишите словами, поведение вашего CopyIf(), вы и сможете сами составить программу.

Добавлено через 2 минуты
хотя я бы не советовал придумывать неведомо что, а оставил именно так как и в СТЛ

PM MAIL   Вверх
шарлотта
Дата 28.5.2017, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Поняла, согласна с Вами, спасибо большое!
PM MAIL   Вверх
шарлотта
Дата 28.5.2017, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Попробовала сделать сортировку так, но не сортирует.
Код

template <class Iterator>
void Sort(Iterator beg, Iterator end) {
    bool swapped = true;
    int j = 0, n = 0;
    Iterator tmp = beg;
    for (;  tmp!= end; ++tmp) {
        n++;
    }
    tmp = beg;
    while (swapped) {
        swapped = false;
        j++;
        for (int i = 0; beg != end && i < n - j; ++beg, i++) {
            if (*beg > *(++beg)) {
                beg--;
                tmp = beg;
                beg = ++beg;
                beg--;
                ++beg = tmp;
                swapped = true;
            }
            --beg;
        }
    }
}


Это сообщение отредактировал(а) шарлотта - 28.5.2017, 14:05
PM MAIL   Вверх
volatile
Дата 28.5.2017, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(шарлотта @  28.5.2017,  13:27 Найти цитируемый пост)
не сортирует.

Ну пузырёк я проще как-нибудь бы сделал, зачем накручивать. вся его прелесть в простоте.
Код

template <class Iterator>
void Sort(Iterator beg, Iterator end) {
    while (beg != end) {
        Iterator cur = beg;
        while (++ cur != end) {
           if (*beg > *cur) {
              auto tmp = *beg;
              *beg = *cur;
              *cur = tmp;
           }
        }
        ++ beg;
    }
}

проверяйте

Добавлено через 52 секунды
вообще-то предикат неплохо использовать вместо жесткого условия, чтоб универсальность получить...

PM MAIL   Вверх
шарлотта
Дата 28.5.2017, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Как все просто. Спасибо Вам огромное!
PM MAIL   Вверх
xvr
Дата 28.5.2017, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(шарлотта @  26.5.2017,  23:04 Найти цитируемый пост)
        op(*beg);// здесь возникает ошибка error C2664: "void main:<lambda_e26df0631702444a8e37b9682c990b52>::operator ()(int &) const": невозможно преобразовать аргумент 1 из "int" в "int &"


Смотрим вызов:

Код

ForEach(list4.Begin(), list4.End(), 
        [](int &x) {
        x = x * 2;
    });


Смотрим реализацию разыменования в итераторе:

Код

    _DataType operator*() {
        return cur_pos->data;
    }
Ваш оператор * возвращает просто int, т.е. модифицировать список через такой итератор не получится (что и приводит к ошибке при вызове)

Разыменование должно выглядеть так:
Код

    _DataType operator*() const {
        return cur_pos->data;
    }
    _DataType& operator*() {
        return cur_pos->data;
    }


Про copyIf - он копирует в уже существующий контейнер (как в stl). Если вам нужно добавлять в пустой контейнер, то (так же, как в stl) нужно сделать специальный итератор, который при инкременте добавляет элемент в контейнер (см например std::back_inserter), и вызывать с ним


PM MAIL   Вверх
шарлотта
Дата 28.5.2017, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Большое спасибо!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1552 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.