Войти
ПрограммированиеФорумОбщее

Как правильно написать operator < в C++ (комментарии) (8 стр)

Страницы: 13 4 5 6 7 8
#105
22:55, 22 дек. 2011

Соломон Страуструбер
> Как же ваше "за счёт шаблонов С++ позволяет писать ещё более оптимально, чем Си"?
Это не так. Говорят, что abstraction penalty C++ порядка 3% от С (сам я исследования не проводил). За счет шаблонов можно ещё сколько-то выиграть на некоторых частных случаях. Шаблоны подстраиваются под конкретную ситуацию. Это значит, что только в части случаев можно получить ту самую победу над Си, но остальные куски кода будут с тем же самым abstraction penalty.
За счет шаблонов вообще редко бывает выигрыш по объёму памяти, хотя возможен. Выигрыш больше по оптимизации производительности.

Ghost2
> Тяжелые строчки не всегда нужны. Некоторые говорят, что совсем не нужны. А char* - прекрасен и лаконичен.
Это не для меня. Люблю, когда меньше нужно самому что-то делать. Чем больше за меня сделает язык, библиотека или проц, тем более красивым и приятным мне кажется код. Если string за меня будет хранить длину, управлять памятью, давать всякие синтаксические сахаринки, чтобы было меньше писанины, тем я буду больше получать удовольствие. Больше времени можно будет подумать над алгоритмом. Не люблю скурпулёзно краптеть над каждым мелким действием и самостоятельно следить за всеми мелкими деталями.
Вот за что я не люблю писать под встроенные устройства с малыми вычислительными мощностями, это за то, что приходится переваливать часть работы на себя с контролёра, тк тот не справится сам. Вплоть до необходимости писать на Си всю программу. Но обычно для устройств с такими контролёрами серьёзная работа над строковыми данными не нужна и это даёт мне серьёзное  облегчение.
В целом, если есть возможность выбрать проект, то стараюсь выбирать встроенные девайсы по мощнее и с С++ :)

Таки получилось через boost, но как-то неожиданно очень коряво. Тормозно. И уж тем более никакого inplace. Интересно, можно написать лучше?

#include <boost/tokenizer.hpp>
#include <boost/range/sub_range.hpp>
#include <boost/algorithm/string/join.hpp>

using namespace std;
using namespace boost;
using namespace boost::algorithm;

const string removeNearDuplicateSpaces(const string& s)
{
   string r;
   r.reserve(s.size());
   tokenizer<char_separator<char> > splt(s, char_separator<char>(" "));
   sub_range<decltype(splt)> rng(splt);
   if(s.size()>0&&s.front()==' ')
      r=" ";
   r+=join(rng, " ");
   if(s.size()>0&&s.back()==' '&&r.size()>0&&r.back()!=' ')
      r+=' ';
   r.shrink_to_fit();
   return r;
};

Чтобы не оффтопить, то переходим на.


#106
23:09, 22 дек. 2011

Ghost2
> glib/GTK, как-бе.
Вот как раз про это и говорят: не нужен. :)

#107
23:10, 22 дек. 2011

laMer007

> А разве не наоборот? Когда работаешь с девайсом, в котором мало памяти, то STL не нужен.
Это и имелось ввиду. Литературный оборот.

ТарасЪ

> Тогда не рассказывайте про то, что автодеструкторы и шаблоны позволяют писать безопасный код.
Кто поумнее, об этом никогда не рассказывает. Безопасность кода это опосредованное следствие его простоты. Чем проще код, тем он потенциально более безопасный. Автодеструкторы, шаблоны позволяют упростить код. Nuff said...

> Чё, крестокомпилятор не может убрать все переголовы из СТЛ классов?
Разумеется может. И убирает. Но при чем тут вообще шаблоны? Я говорил про тяжеловесность самого функционала.

> Как же ваше "за счёт шаблонов С++ позволяет писать ещё более оптимально, чем Си"?
Что значит писать оптимально? Нас в университете учили (на лекциях по оптимальному обнаружению сигналов) - когда произносишь слово "оптимально", назови критерий оптимальности. Для меня, например, по скорости и комфорту оптимально ездить на новом CL65, но совершенно не оптимально по количеству рублей, потраченных на такое удовольствие.

PS. И хватит разговаривать с "нами".

#108
12:48, 26 дек. 2011

код из статьи http://erdani.com/publications/cuj-2006-02.pdf Александреску.
The comparison predicate would implement classic lexicographical comparison of two vectors:

struct MyLess {
bool operator()(
const vector<unsigned>& lhs,
const vector<unsigned>& rhs) const {
const unsigned
*li = &*lhs.begin(),
*ri = &*rhs.begin(),
*const le = &*lhs.end(),
*const re = &*rhs.end();
for (; ; ++li, ++ri) {
if (ri == re) return false;
if (li == le) return true;
if (*li != *ri) break;
}
return *li < *ri;
}
};

#109
12:16, 10 янв. 2012

надо бы еще написать о std::lexicographical_compare

#110
12:37, 10 янв. 2012

Ghost2
> Когда, например, у тебя 8кБ на стек, данные и память (512 байт из которых
> съедает окружение), мгновенно осознаешь, зачем тебе нужны string, iostreams и
> stl вообще. Потом начинаешь понимать, что и на десктопе C-style хаки довольно
> эффективны.

потом, с опытом, понимаешь, есть места где надо показывать свою крутизну, а есть где не надо...  это называется постижение дао :)

#111
16:34, 10 янв. 2012

давайте без оффтопа.

#112
17:47, 10 янв. 2012

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

Страницы: 13 4 5 6 7 8
ПрограммированиеФорумОбщее

Тема в архиве.