Здравствуйте, Draqon, Вы писали:
D>Нутром чую, что можно это с помощью std::accumulate сделать, а вот как?...
struct op
{
int operator()(int res, int val)
{
return res*26+val-'A'+1;
}
};
int main()
{
std::string str="AZ";
int res=std::accumulate(str.begin(), str.end(), 0, op());
return 0;
D>P.S. и без boost.
И зря
boost::lambda
int res2=std::accumulate(str.begin(), str.end(), 0, _1*26+_2-'A'+1);
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, What, Вы писали:
W>1. result может быть меньше 0, если строка не имеет вид [A-Z]+, поэтому я бы заменил его тип на int
Если строка не имеет такой вид то эта формула вобще говоря становится полным бредом.
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
AD>Если это расчёт hash-функции, то твой вариант — однозначно быстрее, а соответственно и лучше.
Really? А почему вы считаете, что многократный вызов в цикле функции end() однозначно быстрее, чем однократное вычисление при вызове алгоритма?
Apart from that error, вы проводили вычисление, что быстрее — accumulate или собственный цикл? И ли просто так считате?
Apart from that, и наконец, почему вы считаете, что быстрее — это синоним слова лучше?
Здравствуйте, Vamp, Вы писали:
AD>>Если это расчёт hash-функции, то твой вариант — однозначно быстрее, а соответственно и лучше. V>Really? А почему вы считаете, что многократный вызов в цикле функции end() однозначно быстрее, чем однократное вычисление при вызове алгоритма?
Согласен, просмотрел:
for (string::iterator i=s.begin(), end = s.end(); i != end; ++i)
result = result*26 + (*i) - 'A' + 1;
V>Apart from that error, вы проводили вычисление, что быстрее — accumulate или собственный цикл? И ли просто так считате?
Считаю. Но если интересно, могу и проверить.
V>Apart from that, и наконец, почему вы считаете, что быстрее — это синоним слова лучше?
Постори начало моего ответа.
Здравствуйте, ArtDenis, Вы писали:
AD>Но надо учитывать ещё и то, что не все компиляторы такие "правильные". Кстати, а как будет выглядеть код в случае использования boost::lambda ?
На одну команду больше
Во-первых: спасибо за ответы.
Во-вторых: скорость не очень критична, хотя с замечанием об end() согласен на 100%.
В-третьих: с вынесеним формулы в функциональный объект (именованный либо лямбда) и так всё ясно. Вопрос в том, как (можно ли) с помощью СТАНДАРТНЫХ средств С++ & STL эту лямбду как-то сделать.
[off]Чувствую скоро с помощью STL получится С++-диалект ЛИСПа [/off]
Здравствуйте, Draqon, Вы писали:
D>Вопрос в том, как (можно ли) с помощью СТАНДАРТНЫХ средств С++ & STL эту лямбду как-то сделать.
Вопрос в том, что понимать под станлартными средствами.
D>>Вопрос в том, как (можно ли) с помощью СТАНДАРТНЫХ средств С++ & STL эту лямбду как-то D>>сделать. A> Вопрос в том, что понимать под станлартными средствами.
Здравствуйте, Андрей Галюзин, Вы писали:
D>>>Вопрос в том, как (можно ли) с помощью СТАНДАРТНЫХ средств С++ & STL эту лямбду как-то D>>>сделать. A>> Вопрос в том, что понимать под станлартными средствами.
АГ>Дефакто или деюро?
Вот в том-то и дело, что де-юре ламбда реализована вполне стандартными средствами; вопрос о том, что понимать под стандартными де-факто вещами остается открытым .
Подозреваю, для Wolfhound'а это вполне стандартные вещи.
A> Вот в том-то и дело, что де-юре ламбда реализована вполне стандартными средствами; вопрос о A> том, что понимать под стандартными де-факто вещами остается открытым .
Вопрос, конечно, открытый, но кое-что можно узнать уже сейчас. Подробности не помню, за справками к Паше или Максиму.
Например, boost::function и boost::shared_ptr с высокой вероятностью войдут в стандарт.
A> Подозреваю, для Wolfhound'а это вполне стандартные вещи.