Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129

Обобщённые алгоритмы

28.06.2022, 19:29. Показов 772. Ответов 2

Студворк — интернет-сервис помощи студентам
Добрый день. Есть задание:

/*Задан дек(std::deque<...>), содержащий элементы типа MyStirng(класс из
лабораторной работы №2).Создайте:
a) шаблон функции my_negate(…), предназначенный для изменения знака
параметра на противоположный.Для базовых арифметических типов он изменяет
+ на - и наоборот;
б) специализацию шаблона для класса Mystring, которая изменяет регистр
очередного символа в строке на противоположный;
в) с помощью алгоритма std::transform и разработанного шаблона измените
регистр во всех строках, хранящихся в деке.
г) Распечатайте дек до и после изменения*/

Mystring.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyString
{
    char* m_pStr;   //строка-член класса
 
public:
    MyString();                      // конструктор по умолчанию
    MyString(const char* str);       // конструктор с параметром
    MyString(const MyString& other); // конструктор копирования
    MyString(MyString&& other);      // конструктор перемещения
 
    ~MyString(); // деструктор
 
    const char* GetString()const;
    void SetNewString(const char* str);
 
    MyString& operator=(const MyString& other);    // оператор присвоения
    MyString& operator=(MyString&& other); // оператор перемещения
 
    friend std::ostream& operator<<(std::ostream& os, const MyString& other);
    friend std::ostream& operator>>(std::ostream& os, MyString& other);
};
 
std::ostream& operator<<(std::ostream& os, const MyString& other);
std::ostream& operator>>(std::ostream& os, MyString& other);
Mystring.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include < string.h >
#include "MyStirng.h"
#include <iostream>
 
MyString::MyString()
{
    m_pStr = nullptr;
}
 
MyString::MyString(const char* str)
{
    m_pStr = new char[strlen(str) + 1];
    strcpy(m_pStr, str);
}
 
MyString::MyString(const MyString& other)
{
    m_pStr = new char[strlen(other.m_pStr) + 1];
    strcpy(m_pStr, other.m_pStr);
}
 
MyString::MyString(MyString&& other)
{
    std::swap(m_pStr, other.m_pStr);
}
 
MyString::~MyString()
{
    delete[] m_pStr;
}
 
void MyString::SetNewString(const char* str)
{
    delete[] m_pStr;
    if (str != nullptr)
    {
        m_pStr = new char[strlen(str) + 1];
        strcpy(m_pStr, str);
    }
}
 
const char* MyString::GetString()const
{
    return this->m_pStr;
}
 
MyString& MyString:: operator=(const MyString& other)
{
    m_pStr = new char[strlen(other.m_pStr) + 1];
    strcpy(m_pStr, other.m_pStr);
 
    return *this;
}
 
MyString& MyString::operator=(MyString&& other)
{
    if (this != &other)
    {
        if (this->m_pStr != nullptr)
        {
            delete[] m_pStr;
        }
        this->m_pStr = other.m_pStr;
        other.m_pStr = nullptr;
    }
    return *this;
}
 
std::ostream& operator<<(std::ostream& os, const MyString& other)
{
    os << other.m_pStr << std::endl;
    return os;
}
 
std::ostream& operator>>(std::ostream& os, MyString& other)
{
    os >> other;
    return os;
}
Пытаюсь реализовать шаблон функции.

C++
1
2
3
4
5
6
7
template <class T>
void my_negate(const T& FROM, const T& TO)
{
 
    transform(typename T::const_iterator it = FROM.begin(), typename T::const_iterator it1 = FROM.end(), TO, UnalF f);
 
}
Подскажите пожалуйста, как это сделать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.06.2022, 19:29
Ответы с готовыми решениями:

Обобщенные классы
Добрый день. Допустим у нас имеется простой обобщенный класс template &lt;class Type&gt; class MyClass{ Type x,y,z; ...

обобщенные версии функций
помогите с заданием: написать небольшую программу для тестирования обобщенных версий функций printf и scanf. Это по системному...

Обобщенные классы. Алгоритм поиска
Никак не могу понять почему-то с виду простую задачку. Даны вектор V и список L; вектор V имеет четное количество элементов. Продублировать...

2
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
29.06.2022, 16:51
Лучший ответ Сообщение было отмечено Nik_787 как решение

Решение

Добрый день.

Цитата Сообщение от Nik_787 Посмотреть сообщение
/*Задан дек(std::deque<...>), содержащий элементы типа MyStirng(класс из
лабораторной работы №2).Создайте:
a) шаблон функции my_negate(…), предназначенный для изменения знака
параметра на противоположный.Для базовых арифметических типов он изменяет
+ на - и наоборот;
б) специализацию шаблона для класса Mystring, которая изменяет регистр
очередного символа в строке на противоположный;
в) с помощью алгоритма std::transform и разработанного шаблона измените
регистр во всех строках, хранящихся в деке.
г) Распечатайте дек до и после изменения*/
/* А задание так и задано -- со слешами и звездочками в начале и в конце?
Думаете, они важны для сути? */

Цитата Сообщение от Nik_787 Посмотреть сообщение
изменяет регистр
очередного символа в строке на противоположный
Может быть "каждого", а не "очередного"?
Корявый перевод?

Цитата Сообщение от Nik_787 Посмотреть сообщение
std::ostream& operator>>(std::ostream& os, MyString& other)
{
    os >> other;
    return os;
}
М. Бесконечная рекурсия?

Цитата Сообщение от Nik_787 Посмотреть сообщение
в) с помощью алгоритма std::transform и разработанного шаблона измените
регистр во всех строках, хранящихся в деке.
"Алгоритм std::transform" копирует рэнж значений в итератор вывода.
Надеюсь, эта строка не подразумевает, что значения внутри исходной деки должны поменяться?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <deque>
#include <cstring>
#include <utility>
#include <locale>
#include <algorithm>
 
class String {
public:
    using Iterator = char*;
    using ConstIterator = const char*;
 
    String() : size(0), data(new char[1]{0}) {}
    String(const char *data) : size(std::strlen(data)), data(std::strcpy(new char[size + 1], data)) {}
    String(const String &other) : size(other.size), data(std::strcpy(new char[size + 1], other.data)) {}
    String(String &&other) noexcept : size(other.size), data(std::exchange(other.data, nullptr)) {}
    // Назначение оператора.
    String &operator=(const String &other) {
        if (this != &other) {
            delete[] data;
            size = other.size;
            data = std::strcpy(new char[size + 1], other.data);
        }
        return *this;
    }
    // Назначение оператора.
    String &operator=(String &&other) noexcept {
        if (this != &other) {
            size = other.size;
            data = std::exchange(other.data, data);
        }
        return *this;
    }
    virtual ~String() {
        delete[] data;
    }
    const char *asCString() const {
        return data;
    }
    char *asCString() {
        return data;
    }
    std::size_t getSize() const {
        return size;
    }
    Iterator begin() {
        return data;
    }
    Iterator end() {
        return data + size;
    }
    ConstIterator begin() const {
        return data;
    }
    ConstIterator end() const {
        return data + size;
    }
private:
    std::size_t size;
    char *data;
};
 
std::ostream &operator<<(std::ostream &out, const String &s) {
    return out << "\"" << s.asCString() << "\"";
}
 
template<typename T>
std::ostream &operator<<(std::ostream &out, const std::deque<T> &deque) {
    for (const auto &i : deque) {
        out << i << " ";
    }
    return out;
}
 
template<typename T>
T negate(const T &in) {
    return -in;
}
 
template<>
String negate<String>(const String &in) {
    String result = in;
    std::locale locale;
    for (char &i : result) {
        if (std::islower(i, locale)) {
            i = std::toupper<char>(i, locale);
        } else if (std::isupper(i, locale)) {
            i = std::tolower<char>(i, locale);
        }
    }
    return result;
}
 
int main() {
 
    std::deque<String> deque{"abcd", "AbCd", "aBcD", "ABCD"};
    std::cout << deque << std::endl;
 
    std::deque<String> result;
    std::transform(deque.begin(), deque.end(),
                   std::inserter(result, result.begin()),
                   [](String &s) { return negate(s); });
 
    std::cout << result << std::endl;
    return 0;
}
1
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129
29.06.2022, 16:58  [ТС]
Спасибо !!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2022, 16:58
Помогаю со студенческими работами здесь

Обобщённые типы и const&
Добрый день, объясните пожалуйста: Почему когда тип становится обобщенным, в параметрах функций нужно передавать его по const&amp; ?

Алгоритмы с++, алгоритмы на деревьях
Всем привет. Помогите, пожалуйста, идейно решить задачу. В теме есть список алгоритмов, из которого нужно просто выбрать, каким...

Переводчик через обобщенные алгоритмы, без "классических" циклов
Первый файл содержит словарь в виде пар слов (ключ-значение). Второй файл содержит обычный текст. С помощью обобщённых алгоритмов...

Обобщенные классы
Помогите пожалуйста решить задание: Написать обобщённый класс PriorityStack, реализующий стек с приоритетом, хранящий значения...

Обобщенные классы
Всем привет. Парюсь с лабораторной работой, не знаю как делать. Может кто-нибудь подскажет, как её хотя бы делать. Буду благодарен. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru