On May 6, 3:34 pm, S S <sarvesh.si...@[EMAIL PROTECTED]
> wrote:
> On May 6, 2:38 pm, "Jim Langston" <tazmas...@[EMAIL PROTECTED]
> wrote:
>
>
>
>
>
>
>
> > S S wrote:
> > > Hi
>
> > > I have a very basic question, but it's a good one. Below is the code
> > > fragment.
>
> > > struct ltstr
> > > {
> > > bool operator()(const char* s1, const char* s2) const
> > > {
> > > return strcmp(s1, s2) < 0;
> > > }
> > > };
>
> > > int main()
> > > {
> > > const int N = 6;
> > > const char* a[N] = {"isomer", "ephemeral", "prosaic",
> > > "nugatory", "artichoke", "serif"};
> > > set<const char*, ltstr> A(a, a + N);
> > > if (A.find("ephemeral") != A.end())
> > > cout << "Found";
> > > else
> > > cout << "Not found";
> > > return 0;
> > > }
>
> > > Output will be -> "Found"
> > > My question is , Why?
>
> > > How it is able to compare a const char* with another const char* to
> > > find that value? I did not specify any equality operator? I just
> > > mentioned strcmp(s1, s2) < 0
> > > which means, when strcmp(s1, s2) == 0 (in case of match)
> > > it will return false. So how set/map are able to find the const
char*
> > > value?
>
> > I believe it's undefined behavior. You have the constant "ephemeral"
in
> > your program twice. Once for the char array, once for the parameter
of the
> > find. The compiler probably sees that they are exactly the same, so
instead
> > of making 2 it just makes one and uses the same pointer for both.
>
> > An example of this is this program that on my system outputs:
> > 00416808 00416808
> > one time I run it
>
> > #include <iostream>
>
> > int main()
> > {
> > const char* foo = "Hello";
> > const char* bar = "Hello";
>
> > std::cout << reinterpret_cast<const int*>( foo ) << " " <<
> > reinterpret_cast<const int*>( bar ) << "\n";
>
> > }
>
> > The compiler doesn't bother to create two constant arrays for "Hello",
since
> > it's constant it just creates it once and uses the same address for
both foo
> > and bar.
>
> > --
> > Jim Langston
> > tazmas...@[EMAIL PROTECTED]
>
> Jim,
>
> This way, it has been used extensively in our code, and it all works
> fine. I am not much convinced with your argument, but you may be true.
> But then, how to use find() function?
One more point I wanted to make, same should be the case with map when
we use something like
m["somestring"]
? So what to do in such case where find and above kind of syntax is
undefined???


|