Собственно само задание звучит так:
Создать класс строку, который должен содержать следующие сведения: длина строки, количество выделенных байт, которые занимает строка. Класс должен иметь деструктор, конструктор по умолчанию и конструктор с параметром (Выделять память под строку блоками заданной длиной).
Написать метод объединения строк, результат должен содержать только те символы которые есть в первой строке и нет во втором за которыми следуют символы второй строки которых нет в первом.
Вроде как смог разобраться с выделением памяти, но дальше застрял и не понимаю что делать
Вот код:
#include <iostream>
#include <string.h>
using namespace std;
class String {
private:
char *_string;
uint32_t memlen, step, len;
public:
String():_string(new char[0]), memlen(0), step(10), len(0){}
String(const char *str, int step = 10) {
if (step > 0)
this -> step = step;
else
this -> step = 16;
len = strlen(str);
cout << this -> len << endl;
memlen = step * ((len + step) / step);
this -> _string = new char[memlen];
strcpy(_string, str);
}
~String() {
delete [] _string;
}
// проверка, работает ли выделение памяти
void show()
{
for(uint32_t i=0; i<len; i++)
cout<<_string[i];
cout<<endl;
}
};
int main()
{
String s("Hello World!");
s.show();
return 0;
}
Ну примерно так. Работает за O(n), где n - наибольшая из длин двух строк
...класс String...
void str_union(const char *str2) {
const size_t alphabet_size = 128;
// множества символов первой и второй строк
// тут было бы лучше использовать std::unordered_set<char>, но и так сойдёт
bool char_set1[alphabet_size]{};
bool char_set2[alphabet_size]{};
const char *str1 = _string;
size_t len1 = len;
size_t len2 = strlen(str2);
// заносим символы первой строки в множество
for (size_t i = 0; i < len1; i++) {
char_set1[str1[i]] = true;
}
// заносим символы второй строки в множество
for (size_t i = 0; i < len2; i++) {
char_set2[str2[i]] = true;
}
// потенциальная длина новой строки с нуль символом;
size_t new_size = len1 + len2 + 1;
size_t new_memlen = step * ((new_size + step - 1) / step); // -1 для корректного округления вверх
char *new_string = new char[new_memlen];
size_t new_len = 0;
for (size_t i = 0; i < len1; i++) {
// проверяем есть ли символ из первой строки во множестве символов второй строки
if (char_set2[str1[i]] == false) {
//если нет, то копируем в новую строку
new_string[new_len++] = str1[i];
}
}
for (size_t i = 0; i < len2; i++) {
// проверяем есть ли символ из второй строки во множестве символов первой строки
if (char_set1[str2[i]] == false) {
new_string[new_len++] = str2[i];
}
}
new_string[new_len] = '\0';
// для уменьшения памяти
size_t buff_memlen = step * ((new_len + 1 + step - 1) / step); // +1 для нуль-символа
if (buff_memlen < new_memlen) {
char *buff_string = new char[buff_memlen];
strcpy(buff_string, new_string);
delete[] new_string;
new_string = buff_string;
new_memlen = buff_memlen;
}
len = new_len;
memlen = new_memlen;
delete[] _string;
_string = new_string;
}
...класс String...
...в main...
String s("Hello World!");
s.str_union("ello rd;hei-TlhoErRdE");
s.show();
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Задача про Диету Деда Мороза, подробнее на картинкеСамая простая задача из тех что были, все решил эту не удается
Имеется map<string, int> и vector<string>