C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Эффективная работа с AnsiString
** kea
Отправлено: 01.11.2005, 17:10


Не зарегистрирован







Здравствуйте!
Какой из кусков кода эффективней по количеству выполняемых операций:
if ( BitSum == true )
BitStr = "1" + BitStr;
else
BitStr = "0" + BitStr;
или
BitStr = AnsiString( (int)BitSum ) + BitStr;
Георгий
Отправлено: 01.11.2005, 21:44


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



одинаково тормознуто.

быстрее будет если подписывать в конец строки или использовать массив с заранее зарезервированный размером и подписывать в конец smile.gif.

Отредактировано Георгий — 01/11/2005, 22:45
AVC
Отправлено: 02.11.2005, 09:49


Ветеран

Группа: Модератор
Сообщений: 1583



2** kea
В BitStr иметь впереди один лишний символ (пробел?) и писать что то типа
BitStr[1] = BitSum? '1' : '0'; или *(BitStr.c_str()) = BitSum? '1' : '0';
Но если стал вопрос об оптимальности лучше перейти к простым типам и массивам типа char.
Asher
Отправлено: 02.11.2005, 11:21


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Оптимальным будет формировать строку BitStr длиннее на один символ, который стоит вначале и имеет значение '0'.
Тогда в конце просто
if ( BitSum)
BitStr[1] = '1';
olegenty
Отправлено: 02.11.2005, 11:48


Ветеран

Группа: Модератор
Сообщений: 2412



странно, что вариант с классом никто не предлагает smile.gif
** kea
Отправлено: 02.11.2005, 17:16


Не зарегистрирован







Здравствуйте!
Второй вариант вероятно более эффективен, если работать с AnsiString.

Что за вариант с классами?
Grigoriy
Отправлено: 02.11.2005, 17:23


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE
или
BitStr = AnsiString( (int)BitSum ) + BitStr;

Этот код правильно работает.
Но в этом случае процессор будет копировать область памяти, которую занимала старая строка на новое место и затратится определенное количество тактов.
Лучше сразу размер строки сделать на один байт больше и тогда :
CODE

BitStr[1]=(unsigned char)BitSum+0x30;


Символ '0' кодируется в таблице кодов символов ANSI и ASCII
байтом со значением
00110000 (двоичная система)
0x30 (шестнадцатеричная система)
48 (десятичная).
kea
Отправлено: 02.11.2005, 17:46


Станционный диспетчер

Группа: Участник
Сообщений: 80



Здравствуйте! Размер строки увеличивается на один символ в цикле, например до 16 или 32.
Asher
Отправлено: 02.11.2005, 17:54


Мастер участка

Группа: Модератор
Сообщений: 550



QUOTE
Здравствуйте! Размер строки увеличивается на один символ в цикле, например до 16 или 32.

И тебе привет. biggrin.gif
Начинай не с пустой строки, а с строки в которой уже лежит "0"
А в конце делай как я сказал.

А еще лучше сформируй строку нулей нужной длины и меняй в нужных позициях нули на единицы

P.S. Вспомнил поговорку времен ранней молодости:
"Слушай меня и голос америки." cool.gif
Георгий
Отправлено: 02.11.2005, 23:55


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



а может тут не строка нужна, а
CODE
std::vector<bool>
?

Отредактировано Георгий — 03/11/2005, 00:55
AVC
Отправлено: 03.11.2005, 09:36


Ветеран

Группа: Модератор
Сообщений: 1583



? int16 / int32 и установки, проверки битов ?

Вернуться в Вопросы программирования в C++Builder