Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизировать код 
V
    Опции темы
mes
Дата 16.4.2010, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(ИванМ @  15.4.2010,  23:46 Найти цитируемый пост)
Может я как то не так задачу описал.
Например, если строка=1e4, то должно быть на выходе: 10000.

ну так smile  тут совсем другое :
Цитата(ИванМ @  15.4.2010,  22:52 Найти цитируемый пост)
xxxEyyy, на выходе xxx000




--------------------
PM MAIL WWW   Вверх
djamshud
Дата 16.4.2010, 00:56 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



jonie, я сейчас матом буду ругаться. Повторяю, я думал в std::string есть char*-доступ. Посмотрел API, узнал, что только char const*, признал, что был не прав. Вы, судя по всему зная этот API, вместо того, чтобы показать на него, начали и продолжаете сыпать терминами. Уймитесь наконец.

И да, в std::string есть C-o-W, но само по себе это не означает, что не может быть предоставлен прямой доступ к данным. Важно, что нет интерфейса получения этого доступа.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
ИванМ
Дата 16.4.2010, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Пример работы программы:
replace_e("1e4") -> "10000"
replace_e("12e2") -> "1200"
Вы видимо меня не поняли.

Цитата(jonie @  16.4.2010,  00:53 Найти цитируемый пост)
в исходном задании таких условий не было. кроме того,  find_first_of работает так:
Цитата
Searches the string for any of the characters that are part of either str, s or c, and returns the position of the first occurrence in the string.
туда можно прередать "eE".

тогда так перепишу:
Код

string replace_e(string str)
{
    size_t i=str.find_first_of("eE");
    if(i==string::npos)
        return str;

    stringstream s(str.substr(i+1));
    int n;
    s>>n;
    str.reserve(i+n);
    str.resize(i);
    str.append(n, '0');

    return str;
}


Добавлено через 57 секунд
mes, прастите. Плохо сформулировал задачу.
PM MAIL   Вверх
mes
Дата 16.4.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(ИванМ @  15.4.2010,  23:58 Найти цитируемый пост)
string replace_e(string str)

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



--------------------
PM MAIL WWW   Вверх
jonie
Дата 16.4.2010, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



если вам нужна скорость, то вот это
Код

    stringstream s(str.substr(i+1));
    int n;
    s>>n;

вероятно можно заменить на
Код

int n=atoi(str.c_str()+i);

.... 
в общем подумать можно и еще, но поздно.

ЗЫ: подумайте насчет передачи строки в функцию по ссылке, если у вас не c++0x, то копирования избежите...
UPD: mes опередил)

UPD2:
Код

    str.reserve(i+n);
    str.resize(i);
нет смысла делать reserve.

UPD3:
делайте void resize ( size_t n, char c ); вот и пропал append ...

Это сообщение отредактировал(а) jonie - 16.4.2010, 01:06


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ИванМ
Дата 16.4.2010, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23




Цитата(jonie @  16.4.2010,  01:04 Найти цитируемый пост)
нет смысла делать reserve.

Почему? Разве resize изменяет физический объем буфера?

На счет константной ссылки согласен.
Код

string replace_e(const string& str)
{
    size_t i=str.find_first_of("eE");
    if(i==string::npos)
        return str;

    string str1=str.substr(i+1);
    stringstream s(str1);
    int n;
    s>>n;
    
    str1.resize(i+n, '0');

    return str1;
}



Цитата(jonie @  16.4.2010,  01:04 Найти цитируемый пост)
вероятно можно заменить на
int n=atoi(str.c_str()+i);


Скорость хорошо, но пользоваться сишной библиотекой не хочу категорически.


Это сообщение отредактировал(а) ИванМ - 16.4.2010, 01:20
PM MAIL   Вверх
W4FhLF
Дата 16.4.2010, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Я правильно понял, что строку в которой представлено число в формате exponential надо перевести в строку в которой представлено число в формате fixed? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
jonie
Дата 16.4.2010, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата


Скорость хорошо, но пользоваться сишной библиотекой не хочу категорически.

ИванМ, boost::lexical_cast<int> ....

W4FhLF, да, как потом выяснилось именно это и хотел автор

Это сообщение отредактировал(а) jonie - 16.4.2010, 07:37


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ИванМ
Дата 16.4.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Цитата(W4FhLF @  16.4.2010,  05:22 Найти цитируемый пост)
Я правильно понял, что строку в которой представлено число в формате exponential надо перевести в строку в которой представлено число в формате fixed?  

Почти. Может быть только такой вид: xxxEyyy. 
xxxE+yyy и xxxE-yyy не допускается.

Цитата(jonie @  16.4.2010,  07:35 Найти цитируемый пост)
boost::lexical_cast<int> ....

Нельзя, числа могут быть неограниченной размерности
PM MAIL   Вверх
W4FhLF
Дата 16.4.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(ИванМ @  16.4.2010,  15:47 Найти цитируемый пост)
Нельзя, числа могут быть неограниченной размерности


n тут представляет количество нулей грубо говоря. Ты же сам юзаешь такую же конструкцию:

Код

stringstream s(str.substr(i+1));
    int n;
    s>>n;


Если будет переполнение int'a (при количестве нулей больше 0x7FFFFFFF), то оно будет и в твоём случае (я что-то сомневаюсь, что ты будешь хранит строки по 2.5 гига хранить на число.). Но boost::lexical_cast более лаконичный и быстрый способ. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ИванМ
Дата 16.4.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



W4FhLF, не так понял, прошу прощения. Я думал, мне предлагают исходное число перевести. А так да, воспользуюсь lexical_cast, если он быстрее.

Код

string replace_e(const string& str)
{
    size_t i=str.find_first_of("eE");
    if(i==string::npos)
        return str;

    string str1=str.substr(i+1);
    str1.resize(i+boost::lexical_cast<int>(str1), '0');
    return str1;
}


Вот уже код сократился в несколько раз)

Это сообщение отредактировал(а) ИванМ - 16.4.2010, 16:42
PM MAIL   Вверх
ИванМ
Дата 16.4.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Если больше нечего предложить, тему закрываю. Всем спасибо.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0991 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.