Написать метод объединения строк

154
01 апреля 2019, 06:40

Собственно само задание звучит так:

Создать класс строку, который должен содержать следующие сведения: длина строки, количество выделенных байт, которые занимает строка. Класс должен иметь деструктор, конструктор по умолчанию и конструктор с параметром (Выделять память под строку блоками заданной длиной).

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

Вроде как смог разобраться с выделением памяти, но дальше застрял и не понимаю что делать

Вот код:

#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;
}
Answer 1

Ну примерно так. Работает за 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();
READ ALSO
Задача про Диету Деда Мороза C++

Задача про Диету Деда Мороза C++

Задача про Диету Деда Мороза, подробнее на картинкеСамая простая задача из тех что были, все решил эту не удается

160
C++ парсинг тегов в std::string

C++ парсинг тегов в std::string

Есть std::string например:

146