Jim Langston 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.
>
That does not matter, note the use of the second template argument of
std::set.
--
Ian Collins.


|