programming languages
Ian McCulloch
ianmcc at vaneyk.lorentz.leidenuniv.nl
Tue Feb 12 11:00:06 EST 2002
On Mon, 11 Feb 2002, Paul Matthews wrote:
> OK I've calmed down now. Does not look like there is
> any real viable alternative to C/C++. OCaml looks
> interesting, by the syntax is a little off putting,
> especially the + +. distinctions.
>
> My main whinge with C is the lack of usefull string
> and array abstractions. The same applies to C++. The
> STL seems to add <b>huge</b> amounts of bloat for very
> little real value. Debugging and profiling STL is
> close to impossible due to the bizare an very very
> long names.
What compiler are you using? In principle, templates don't lead
inevitably to code bloat but there are some situations where it can
happen, eg a function is instantiated for N different pointer types, each
produces exactly the same code, but it is replicated N times... There
are tricks to get around this and I imagine that most recent
compilers/libraries are a lot better in this regard than older ones.
>
> [ STL aside: How do you binary insert a single value
> into an already sorted array.]
If its a set/multiset/map/multimap then its automatically sorted, so I
assume your using a std::vector or somesuch.
std::equal_range(Iterator first, Iterator last, Value v) returns a pair of
iterators (i,j] such that all iterators in (first,i] are less than v, and
all iterators in (j,last] are greater than v. All corner-cases taken
care of. Most containers have an insert member function which inserts a
value immediately before the given iterator. So, to insert v into the
container C while leaving it sorted, do
C.insert(std::equal_range(C.begin(), C.end(), v).first, v);
If v already exists in the container, this will insert another at the
front. If you want it at the back instead (only useful if the comparison
defines a partial ordering rather than a total ordering and you care
about where the inserted elements end up) then use
C.insert(std::equal_range(C.begin(), C.end(), v).second, v);
This should work with at least vector, list and deque. It probably also
works with set and multiset as these have a version of insert() that takes
a 'suggestion' as to where the new element should go. So, a generic
version that works on all of the non-associative standard containers is
// function to insert an element into an already sorted container,
// preserving the ordering.
template <class Container, class ValueType>
void insert_sorted(Container& C, const ValueType& v)
{
C.insert(std::equal_range(C.begin(), C.end(), v).first, v);
}
>
> What I do need now is an embedded language, but one
> with a twist. Because I'm writting relationalish
> database product, it needs to know about NULLs. That
> is:
>
> substr(NULL,0,1) is not "" but NULL.
> "Hello"+NULL is NULL not "Hello".
> (a<b) may return NULL not just 'true' or 'false'
I imagine its fairly easy to write a string class in C++ that does this
sort of thing.
Cheers,
Ian
More information about the linux
mailing list