I agree that std.algorithm is better than <algorithm>, but let's
not pretend that C++11 never happened (that happens from time to
time on this forum). The modern C++ version isn't _that_
different:
for(auto& blah: myContainer) { //for-loop condition on one
line
doSomething(blah->impl->myDataField);
if(find(blah->impl->mySubContainer.begin(),
blah->impl->mySubContainer.end(), key) ==
blah->impl->mySubContainer.end()) {
//decltype is way shorter than
std::vector<MyType<Blah>>
//and change-resistant
return decltype(blah)::iterator{};
}
}
Again, I think that std.algorithm is better and that passing a
pair of iterators to everything when 99.9% of the time they'll be
begin() and end() anyway is a massive PITA. I'm a D convert.
Nobody here makes a point of posting D1 code and IMHO there's
also no point in posting C++98 / C++2003 code.
Atila
// You can't even write the for-loop conditions in a single
// line!
for (std::vector<MyType<Blah> >::iterator it =
myContainer.start();
it != myContainer.end();
it++)
{
// What's with this (*smartPtr)->x nonsense everywhere?
doSomething((*((*it)->impl)->myDataField);
// What, I can't even write a simple X != Y if-condition
// in a single line?! Not to mention the silly
// redundancy of having to write out the entire chain of
// dereferences to exactly the same object twice.
if (find((*(*it)->impl)->mySubContainer, key) ==
(*(*it)->impl)->mySubContainer.end())
{
// How I long for D's .init!
std::vector<MyTypeBlah> >::iterator empty;
return empty;
}
}
OK, let's get one thing straight here. Comparing Phobos to STL
is truly
unfair. I spent almost 2 decades writing C++, and wrote code
both using
STL and without (from when STL didn't exist yet), and IME,
Phobos's
range algorithms are *orders* of magnitude better than STL in
terms of
usability. At least. In STL, you have to always manage pointer
pairs,
which become a massive pain when you need to pass multiple
pairs around
(very error-prone, transpose one argument, and you have a nice
segfault
or memory corruption bug). Then you have stupid verbose syntax
like:
// You can't even write the for-loop conditions in a single
// line!
for (std::vector<MyType<Blah> >::iterator it =
myContainer.start();
it != myContainer.end();
it++)
{
// What's with this (*smartPtr)->x nonsense everywhere?
doSomething((*((*it)->impl)->myDataField);
// What, I can't even write a simple X != Y if-condition
// in a single line?! Not to mention the silly
// redundancy of having to write out the entire chain of
// dereferences to exactly the same object twice.
if (find((*(*it)->impl)->mySubContainer, key) ==
(*(*it)->impl)->mySubContainer.end())
{
// How I long for D's .init!
std::vector<MyTypeBlah> >::iterator empty;
return empty;
}
}
Whereas in D:
foreach (item; myContainer) {
doSomething(item.impl.myDataField);
if (!item.mySubContainer.canFind(key))
return ElementType!MyContainer.init;
}
There's no comparison, I tell you. No comparison at all.
> > I actually feel a lot more productive in D than in C++ with
> > strings. Boost's string algorithms library helps fill the
> > gap
> > (and at least you only have one place to look for
> > documentation
> > when you are using it) but overall I prefer my experience
> > working
> > in D with pseudo-member chains.
>
> I found that what I got out of taking the time to learn
> std.algorithm and std.range was worth far more than the
> effort
> invested.
>
Perhaps you're right. But I think there's ***HUGE*** room for
improvement. The key in your sentence is, it shouldn't require
'effort'; if it's not intuitive to programmers with decades of
experience, then there are probably some fundamental design (or
documentation/accessibility) deficiencies that needs to be
prioritised. How is any junior programmer meant to take to D?
No offense, but IME, junior programmers tend to pick up these
things
much faster than experienced programmers with lots of baggage
from other
languages, precisely because they don't have all that baggage
to slow
them down. Old habits die hard, as they say.
That's not to say that the D docs don't need improvement, of
course. But
given all your objections about Phobos algorithms despite
having barely
*used* Phobos, I think the source of your difficulty lies more
in the
baggage than in the documentation. :)
T