Всем привет. Я изучаю классы и перегрузки операций в С++. В общем дали мне тут задание создать некое подобие из STL библиотеки контейнер set. Он у меня сделан, но не совсем правильно работает метод push и перегрузка операции "+". То есть к примеру X + Y. Я закидываю во временный массив Х потом У и после этого я должен их отсортировать и вызвать метод удаления уникальных элементов. Но прежде чем это реализовать, хотелось бы разобраться в чем причина не работы метода push и перегрузки "+". При сложении у меня выдается ошибка, а при использовании push выводится только первая буква. Я думал использовать string или vector'а но потом решил все такие остановится на том что я сделал. Заранее благодарю.
Вот мой код:
#include <iostream>
#include <vector>
using namespace std;
class Set
{
private:
char *num;size_t size;
public:
int min();
void sort();
void unique();
bool find();
Set(){}
Set(char *str)
{
size = strlen(str);
num = new char[size];
for(int i=0; i<size; i++)
{
num[i] = str[i];
}
//sort();
//unique();
}
const Set& push(char *str)
{
char *temp = new char[size+strlen(str)];
for(int i=0; i<size; i++)
{
temp[i] = num[i];
}
temp[size] = *str;
delete [] num;
this->num = temp;
this->size += strlen(str);
return *this;
}
const Set operator+(const Set& s)
{
if(this->size != s.size)
{
return NULL;
}
Set v;
size = v.size + size;
for(int i=0; i<size; i++)
{
v.num[i] = num[i] + s.num[i];
}
return v;
}
friend const ostream& operator<<(ostream& os, const Set& s);
};
const ostream& operator<<(ostream& os, const Set& s)
{
for(int i=0; i<s.size; i++)
{
os << s.num[i];
}
return os;
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
char s[25] = "Hello world ";
Set ss(s);
char q[25] = "Hola\n";
ss.push(q);
Set sw(q);
ss = ss + sw;
cout << ss;
return 0;
}
а при использовании push выводится только первая буква.
Ну так вы в push как раз и копируете только первую букву
for(int i=0; i<size; i++)
{
temp[i] = num[i];
}
temp[size] = *str;
содержимое num[] вы копируете в temp[] целиком - при помощи цикла. А куда девался цикл для str? Почему вы для str не написали такого же цикла?
Вот это
temp[size] = *str;
это копирование только первой буквы.
строчка за строчкой:
const Set operator+(const Set& s)
{
if(this->size != s.size)
{
return NULL;
}
во первых возвращая const Set вы сами создаете неудобство для пользователья. Возвращайте просто Set. Во вторых вы вместо Set возвращаете Null, если размеры множеств не равны?.. и что это означает?... У вас в main() размеры множеств, которые вы суммируете, не равны... пойдем дальше:
Set v;
size = v.size + size;
for(int i=0; i<size; i++)
{
v.num[i] = num[i] + s.num[i];
}
вы определили конструктор по умолчанию с пустым телом, потому у вашего обьекта v данные неинициализированы, но вы его используете, а потом возвращаете, так что у вас ошибка не одна. И потом один маленький совет не по вопросу: старайтесь меньше использовать постинкремент (i++ каждый раз создает временный обьект), особенно в циклах...
То, что тут за класс set не подходит к описанию контейнера set а подходит к описанию vector.
http://ru.cppreference.com/w/cpp/container/set Поиск, удаление и вставка операции имеют логарифмическую сложность. Наборы обычно реализуется как красно-черные деревья.
Действия над вектором как над множеством можно сделать через:
#include <algorithm>
А это неправильно:
Set(){}
должно быть:
Set(){num=nullptr;}
В общем я тут вот так вот исправил и все заработало. Возможно есть варианты это улучшить буду рад если поделитесь.
const Set& push(char *str)
{
char *temp = new char[size+strlen(str)+1];
//char sum;
// for(int i=0; i<size; i++)
// {
// temp[i] = num[i];
// //sum += str[i];
// temp[i] = str[i];
// }
strcat(temp, num);
strcat(temp, str);
//puts(temp);
//temp[size] = sum;
delete [] num;
this->num = temp;
this->size += strlen(str);
return *this;
}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники