/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
STL biblioteket i gcc
Fra : Anders Svendsen


Dato : 06-01-02 00:27

I Bjarne Stroustrup C++ programming language (18.4.2) fremgår det at
algoritmer som mismatch og transform tager 2 iteratorer, der marker
start og slut, for hver af de to sequencer, der gennemløbes plus en
functor.

Men i det STL bibliotek der følger med GCC ser implementationen af
mismatch således ud:

template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
_InputIter1 __last1,
_InputIter2 __first2,
_BinaryPredicate __binary_pred)
{
while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {
++__first1;
++__first2;
}
return pair<_InputIter1, _InputIter2>(__first1, __first2);
}

Den tager altså kun begin og end af den første sekvens og begin af den
anden, personligt foretrækker jeg Stroustrups variant da der opstår en
fejl, hvis sequence nr. 2 er kortere end den første sequence.

Er der nogen, der ved hvad standarden siger, eller som kan give mig en
god (WWW) reference til standarden
så jeg kan løse den slags tvivlsspørgsmål.


 
 
Anders Svendsen (06-01-2002)
Kommentar
Fra : Anders Svendsen


Dato : 06-01-02 00:50

Oups jeg faldt lige over Dinkumware, ifølge dem er Bjarne galt på den...

Senere
Anders

Anders Svendsen wrote:

> I Bjarne Stroustrup C++ programming language (18.4.2) fremgår det at
> algoritmer som mismatch og transform tager 2 iteratorer, der marker
> start og slut, for hver af de to sequencer, der gennemløbes plus en
> functor.
>
> Men i det STL bibliotek der følger med GCC ser implementationen af
> mismatch således ud:
>
> template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
> pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
> _InputIter1 __last1,
> _InputIter2 __first2,
> _BinaryPredicate __binary_pred)
> {
> while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {
> ++__first1;
> ++__first2;
> }
> return pair<_InputIter1, _InputIter2>(__first1, __first2);
> }
>
> Den tager altså kun begin og end af den første sekvens og begin af den
> anden, personligt foretrækker jeg Stroustrups variant da der opstår en
> fejl, hvis sequence nr. 2 er kortere end den første sequence.
>
> Er der nogen, der ved hvad standarden siger, eller som kan give mig en
> god (WWW) reference til standarden
> så jeg kan løse den slags tvivlsspørgsmål.


Anders Melchiorsen (06-01-2002)
Kommentar
Fra : Anders Melchiorsen


Dato : 06-01-02 01:55

Anders Svendsen <ahs@netman.dk> skrev:

> Oups jeg faldt lige over Dinkumware, ifølge dem er Bjarne galt på
> den...

I min udgave (3rd ed, 9th print) er han i overensstemmelse med hvad du
ellers beskrev; s527 siger således "No end is specified for the second
sequence; that is, there is no last2. [...] first2+(last-first) is
used as last2. This technique is used throughout the standard library,
where pairs of sequences are used for operations on pairs of
elements."

--
Regards, Anders

....if a Microsoft product fails, who do you sue?

Mogens Hansen (06-01-2002)
Kommentar
Fra : Mogens Hansen


Dato : 06-01-02 12:07


"Anders Melchiorsen" <anders@kalibalik.dk> wrote in message
news:m2y9jc9u36.fsf@dolle.kalibalik.dk...
>
> I min udgave (3rd ed, 9th print) er han i overensstemmelse med hvad du
> ellers beskrev; s527 siger således "No end is specified for the second
> sequence; that is, there is no last2. [...] first2+(last-first) is
> used as last2. This technique is used throughout the standard library,
> where pairs of sequences are used for operations on pairs of
> elements."
>

Det står ikke klart for mig, om du stadig syntes der er uoverensstemmelse
mellem de forskellige kilder Bjarne Stroustrup's bog, gcc biblioteket og
Dinkum dokumentationen.

Venlig hilsen

Mogens Hansen



Anders Melchiorsen (06-01-2002)
Kommentar
Fra : Anders Melchiorsen


Dato : 06-01-02 14:08

"Mogens Hansen" <mogens_h@dk-online.dk> skrev:

> "Anders Melchiorsen" <anders@kalibalik.dk> wrote in message
> news:m2y9jc9u36.fsf@dolle.kalibalik.dk...
> >
> > I min udgave (3rd ed, 9th print) er han i overensstemmelse med hvad du
> > ellers beskrev; s527 siger således "No end is specified for the second
> > sequence; that is, there is no last2. [...] first2+(last-first) is
> > used as last2. This technique is used throughout the standard library,
> > where pairs of sequences are used for operations on pairs of
> > elements."
> >
>
> Det står ikke klart for mig, om du stadig syntes der er
> uoverensstemmelse mellem de forskellige kilder Bjarne Stroustrup's
> bog, gcc biblioteket og Dinkum dokumentationen.

Jeg kan kun se overensstemmelser.


Anders.

Mogens Hansen (06-01-2002)
Kommentar
Fra : Mogens Hansen


Dato : 06-01-02 10:01


"Anders Svendsen" <ahs@netman.dk> wrote in message
news:3C378BD7.476B0CC2@netman.dk...
> I Bjarne Stroustrup C++ programming language (18.4.2) fremgår det at
> algoritmer som mismatch og transform tager 2 iteratorer, der marker
> start og slut, for hver af de to sequencer, der gennemløbes plus en
> functor.
>

Hvilken udgave (incl. oplag) sidder du med ?
I den jeg har her ("The C++ Programming Language, Special Edition", first
printing, January 2000, 18.4.2, side 516) står det rigtigt i henhold til C++
Standarden.
Har du kigget på errata til bogen på Bjarne Stroustrup's hjemmeside
(http://www.research.att.com/~bs/) ?

Der findes 2 forskellige mismatch ifølge C++ Standarden.
En med predicate og en uden predicate:

template<class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>
mismatch(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2);

template<class InputIterator1, class InputIterator2,
class BinaryPredicate>
pair<InputIterator1, InputIterator2>
mismatch(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate pred);


> Men i det STL bibliotek der følger med GCC ser implementationen af
> mismatch således ud:
>
> template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
> pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
> _InputIter1 __last1,
> _InputIter2 __first2,
> _BinaryPredicate __binary_pred)

Så vidt jeg umiddelbart kan se, er det rigtigt.

Venlig hilsen

Mogens Hansen



Anders Svendsen (06-01-2002)
Kommentar
Fra : Anders Svendsen


Dato : 06-01-02 14:58

Mogens Hansen wrote:

> "Anders Svendsen" <ahs@netman.dk> wrote in message
> news:3C378BD7.476B0CC2@netman.dk...
> > I Bjarne Stroustrup C++ programming language (18.4.2) fremgår det at
> > algoritmer som mismatch og transform tager 2 iteratorer, der marker
> > start og slut, for hver af de to sequencer, der gennemløbes plus en
> > functor.
> >
>
> Hvilken udgave (incl. oplag) sidder du med ?
> I den jeg har her ("The C++ Programming Language, Special Edition", first
> printing, January 2000, 18.4.2, side 516) står det rigtigt i henhold til C++
> Standarden.
> Har du kigget på errata til bogen på Bjarne Stroustrup's hjemmeside
> (http://www.research.att.com/~bs/) ?
>

Nej, jeg faldt bar lige over det i går aftes og da undrede det mig for der
plejer ikke at være slinger i valsen hos Bjarne. Men han har åbenbart rettet
det til.

>
> Der findes 2 forskellige mismatch ifølge C++ Standarden.
> En med predicate og en uden predicate:
>

Det er jeg klar over, det er den med predicate det handler om.

>
> template<class InputIterator1, class InputIterator2>
> pair<InputIterator1, InputIterator2>
> mismatch(InputIterator1 first1, InputIterator1 last1,
> InputIterator2 first2);
>
> template<class InputIterator1, class InputIterator2,
> class BinaryPredicate>
> pair<InputIterator1, InputIterator2>
> mismatch(InputIterator1 first1, InputIterator1 last1,
> InputIterator2 first2, BinaryPredicate pred);
>
> > Men i det STL bibliotek der følger med GCC ser implementationen af
> > mismatch således ud:
> >
> > template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
> > pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
> > _InputIter1 __last1,
> > _InputIter2 __first2,
> > _BinaryPredicate __binary_pred)
>
> Så vidt jeg umiddelbart kan se, er det rigtigt.

Det er det også ifølge standarden, som jeg skrev igår. Min Stroustrup er
åbenbart en gammel sag - det er en third printing fra 1997 og beskrives
mismatch (og transform m.fl.) som om de tager 4 iteratorer (2 sæt begin/end)...
Hvis nogen er så (u)heldige at ligge inde med en third printing fra 1997 kan de
se på side 516 hvor mismatch kaldes på denne måde (4 iteratorer)og ligeledes
med transform på side 518.

Tak for svarene.

Senere
Anders


Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste