Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
#1

Аналог std::string - C++

01.12.2013, 10:55. Просмотров 636. Ответов 6
Метки нет (Все метки)

Имеется некоторый класс, обеспечивающий работу с символами UTF-8. Назовём его uchar. Можно ли простым способом организовать класс ustring, полностью соответствующий по принципу взаимодействия с std::string с заменой char на uchar?

Вот реализация класса uchar (пока сырая, сильно не пинайте)
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
107
108
109
110
111
112
113
114
115
116
117
118
119
#ifndef UTF_8
#define UTF_8
#include <iostream>
#include <stdio.h>
#include <string>
 
class uchar
{
    public:
        unsigned char _c[6];
        unsigned int size;
        uchar()
        {
            size=0;
        }
        uchar(unsigned char _rf)
        {
            size=1;
            _c[0]=_rf;
        }
        uchar(std::string _rf)
        {
            _c[0]=_rf[0];
            size=1;
            unsigned int _i,_r=191,_p=32;
            while(_c[0]>_r)
            {
                size++;
                _r+=_p;
                _p/=2;
            }
            for(_i=1;_i<size;_i++)
                _c[_i]=_rf[_i];             
        }
};
 
bool operator ==(uchar _a,uchar _b);
{
    unsigned int _i;
    if(_a.size!=_b.size)
        return false;
    for(_i=0;_i<_a.size;_i++)
        if(_a[_i]!=_b[_i])
            return false;
    return true;
}
 
bool operator !=(uchar _a,uchar _b)
{
    unsigned int _i;
    if(_a.size!=_b.size)
        return true;
    for(_i=0;_i<_a.size;_i++)
        if(_a[_i]!=_b[_i])
            return true;
    return false;
}
 
bool operator <(uchar _a,uchar _b)
{
    if(_a.size==_b.size)
    {
        unsigned int _i=0;
        while(_i<_a.size&&_a[i]==_b[i])
            i++;
        return _a[i]<_b[i];
    }
    return _a.size<_b.size;
}
 
bool operator <=(uchar _a,uchar_b)
{
    return (_a<_b||_a==_b);
}
 
bool operator >(uchar _a,uchar _b)
{
    if(_a.size==_b.size)
    {
        unsigned int _i=0;
        while(_i>_a.size&&_a[i]==_b[i])
            i++;
        return _a[i]>_b[i];
    }
    return _a.size>_b.size;
}
 
bool operator >=(uchar _a,uchar_b)
{
    return (_a>_b||_a==_b);
}
 
std::istream& operator >>(std::istream &_is,uchar &_uc)
{
    unsigned int _i,_r=191,_p=32;
    _is>>_uc._c[0];
    _uc.size=1;
    while(_uc._c[0]>_r)
    {
        _uc.size++;
        _r+=_p;
        _p/=2;
    }
    for(_i=1;_i<_uc.size;_i++)
        _is>>_uc._c[_i];
    return _is;
};
 
std::ostream& operator <<(std::ostream &_os,uchar &_uc)
{
    unsigned int _i;
    for(_i=0;_i<_uc.size;_i++)
        _os<<_uc._c[_i];
    return _os;
}
 
typedef 
 
#endif
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2013, 10:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Аналог std::string (C++):

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

Аналог метода Split для std::string - C++
Как можно раздилить string? вот например строчка из сишарп string s = &quot;class Klass&quot;; string sarr = s.Split(' '); есть...

Реализовать аналог класса std::string с помощью vector - C++
Помогите, пожалуйста, с кодом к заданию: Реализовать аналог класса std::string с помощью vector Заранее спасибо!

запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’ - C++
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Алгоритм std::find_end - аналог std::search_n - C++
Есть два семейства стандартных алгоритмов: std::search и std::find_end. Первое семейство предназначено для поиска первого совпадения...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
01.12.2013, 11:06 #2
вот что такое std::string:
C++
1
typedef basic_string<char> string;
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.12.2013, 11:40 #3
chromium вам в пример
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
02.12.2013, 14:38  [ТС] #4
Да, я знаю что из себя представляют стандартные строки. Я смог наладить работу расширенных символов, но когда делаю расширенные строки... Короче, два вопроса: как после typedef добавить конструктор (дабы задавать широкую строку обычной) и как сделать к ним рабочий аналог getline (второе через первое решается).
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
04.12.2013, 10:54  [ТС] #5
Почему-то люди просто перестают отвечать в темах после второго сооющения от автора темы... Вопрос о конструкторе для аналога остаётся открытым!
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.12.2013, 11:02 #6
Цитата Сообщение от k1-801 Посмотреть сообщение
дабы задавать широкую строку обычной
создай статический метод типа fromStdString, конструктор можно добавить только отнаследовавшись

Добавлено через 1 минуту
Цитата Сообщение от k1-801 Посмотреть сообщение
и как сделать к ним рабочий аналог getline (второе через первое решается).
написать свой
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
05.12.2013, 00:14  [ТС] #7
Цитата Сообщение от Jupiter Посмотреть сообщение
создай статический метод типа fromStdString, конструктор можно добавить только отнаследовавшись

Добавлено через 1 минуту

написать свой
Я вас правильно понял?
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
//ustring beginning
class ustring: public basic_string<uchar>
{
    public:
        ustring(std::string _rf)
        {
            unsigned int _i;
            uchar _tuc;
            for(_i=0;_i<_rf.size();_i+=_tuc.size)
            {
                _tuc=_rf.substr(_i,MAX_UTF_8_SIZE);
                push_back(_tuc);
            }
        }
};
 
//streaming
std::istream& operator >>(std::istream& _is, ustring& _us)
{
    uchar _tuc='0';
    while(_tuc!='\n'&&_tuc!=' '&&_tuc!='    ')
    {
        _is>>_tuc;
        _us.push_back(_tuc);
    }
    return _is;
};
 
std::ostream& operator <<(std::ostream& _os, ustring& _us)
{
    unsigned int _i;
    for(_i=0;_i<_us.size();_i++)
        _os<<_us[_i];
    return _os;
}
 
//getline
std::istream& getline (istream& is, ustring& ustr, char delim)
{
    ustr.clear();
    std::string _ts;
    getline(is,_ts,delim);
    ustr=_ts;
    return is;
}
std::istream& getline (istream& is, ustring& ustr)
{
    ustr.clear();
    std::string _ts;
    getline(is,_ts);
    ustr=_ts;
    return is;
}
/**/
#endif
Добавлено через 7 часов 56 минут
Оно не заработало... Можно подобный но рабочий пример? У меня пока с наследованием... Никак.

Добавлено через 1 час 19 минут
В общем, понятия не имею как но я получил рабочее это.
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#ifndef UTF_8
#define UTF_8
#define MAX_UTF_8_SIZE 6
#include <iostream>
#include <stdio.h>
#include <string>
 
class uchar
{
    public:
        unsigned char _c[MAX_UTF_8_SIZE];
        unsigned int size;
        uchar()
        {
            size=0;
        }
        uchar(const uchar& _rf)
        {
            unsigned int _i;
            size=_rf.size;
            for(_i=0;_i<size;_i++)
                _c[_i]=_rf._c[_i];
        }
        uchar(unsigned char _rf)
        {
            size=1;
            _c[0]=_rf;
        }
        uchar(const char* _rf) //for constructions uchar="";
        {
             _c[0]=_rf[0];
            size=1;
            unsigned int _i,_r=191,_p=32;
            while(_c[0]>_r)
            {
                size++;
                _r+=_p;
                _p/=2;
            }
            for(_i=1;_i<size&&_rf[_i]!='\0';_i++)
                _c[_i]=_rf[_i];
        }
        uchar(std::string _rf)
        {
            _c[0]=_rf[0];
            size=1;
            unsigned int _i,_r=191,_p=32;
            while(_c[0]>_r)
            {
                size++;
                _r+=_p;
                _p/=2;
            }
            for(_i=1;_i<size&&_i<_rf.size();_i++)
                _c[_i]=_rf[_i];             
        }
};
 
bool operator ==(uchar _a, uchar _b)
{
    unsigned int _i;
    if(_a.size!=_b.size)
        return false;
    for(_i=0;_i<_a.size;_i++)
        if(_a._c[_i]!=_b._c[_i])
            return false;
    return true;
}
 
bool operator !=(uchar _a, uchar _b)
{
    unsigned int _i;
    if(_a.size!=_b.size)
        return true;
    for(_i=0;_i<_a.size;_i++)
        if(_a._c[_i]!=_b._c[_i])
            return true;
    return false;
}
 
bool operator <(uchar _a, uchar _b)
{
    if(_a.size==_b.size)
    {
        unsigned int _i=0;
        while(_i<_a.size&&_a._c[_i]==_b._c[_i])
            _i++;
        return _a._c[_i]<_b._c[_i];
    }
    return _a.size<_b.size;
}
 
bool operator <=(uchar _a, uchar _b)
{
    return (_a<_b||_a==_b);
}
 
bool operator >(uchar _a, uchar _b)
{
    if(_a.size==_b.size)
    {
        unsigned int _i=0;
        while(_i>_a.size&&_a._c[_i]==_b._c[_i])
            _i++;
        return _a._c[_i]>_b._c[_i];
    }
    return _a.size>_b.size;
}
 
bool operator >=(uchar _a, uchar _b)
{
    return (_a>_b||_a==_b);
}
 
std::istream& operator >>(std::istream& _is, uchar& _uc)
{
    unsigned int _i,_r=191,_p=32;
    _is>>_uc._c[0];
    _uc.size=1;
    while(_uc._c[0]>_r)
    {
        _uc.size++;
        _r+=_p;
        _p/=2;
    }
    for(_i=1;_i<_uc.size;_i++)
        _is>>_uc._c[_i];
    return _is;
};
 
std::ostream& operator <<(std::ostream& _os, uchar& _uc)
{
    unsigned int _i;
    for(_i=0;_i<_uc.size;_i++)
        _os<<_uc._c[_i];
    return _os;
}
 
 
//ustring beginning
class ustring: public basic_string<uchar>
{
    public:
        ustring():basic_string<uchar>()
        {
            
        }
        ustring(const char* _rf):basic_string<uchar>() //for constructions ustring="";
        {
            unsigned int _i;
            uchar _tuc;
            for(_i=0;_i<_rf[_i]!='\0';_i+=_tuc.size)
            {
                _tuc=&_rf[_i];
                push_back(_tuc);
            };
        }
        ustring(std::string _rf):basic_string<uchar>()
        {
            unsigned int _i;
            uchar _tuc;
            for(_i=0;_i<_rf.size();_i+=_tuc.size)
            {
                _tuc=_rf.substr(_i,MAX_UTF_8_SIZE);
                push_back(_tuc);
            };
        }
};
 
//streaming
std::istream& operator >>(std::istream& _is, ustring& _us)
{
    uchar _tuc='0';
    while(_tuc!='\n'&&_tuc!=' '&&_tuc!='    ')
    {
        _is>>_tuc;
        _us.push_back(_tuc);
    }
    return _is;
};
 
std::ostream& operator <<(std::ostream& _os, ustring& _us)
{
    unsigned int _i;
    for(_i=0;_i<_us.size();_i++)
        _os<<_us[_i];
    return _os;
}
 
//getline
std::istream& getline (istream& is, ustring& ustr, char delim)
{
    ustr.clear();
    std::string _ts;
    getline(is,_ts,delim);
    ustr=_ts;
    return is;
}
std::istream& getline (istream& is, ustring& ustr)
{
    ustr.clear();
    std::string _ts;
    getline(is,_ts);
    ustr=_ts;
    return is;
}
/**/
#endif
Кто-нибудь, скажите, если что-то лучше сделать иначе.
P.S. Я там конструкторы символов также подправил. Можно делать push_back("ы"); (русские символы в utf-8 переделываются в uchar и спокойно посылаются, проблема лишь не забыть что кавычки двойные). Также сделал ещё конструктор от const char* - можно писать ustring="Русский текст в UTF-8"; - и это будет работать. Вводится спокойно через getline(cin,ustring); и через cin>>ustring; и выводится cout<<ustring; так же как обычные строки.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2013, 00:14
Привет! Вот еще темы с ответами:

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Операция std::cout для Объекта типа std::string - C++
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; void...

Передача функции указатель на элемент std::vector<std::string> - C++
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в качестве параметра указатель на...

Как правильно перевести std::wstring в std::string ? - C++
Собственно как? :)


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.12.2013, 00:14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru