স্ট্যান্ড :: স্ট্রিং এবং সি-স্টাইলের স্ট্রিং লিটারেলের সাথে তুলনা করা


9

ধরুন আমার কাছে নিম্নলিখিত কোড রয়েছে:

#include <iostream>
#include <string>
#include <iomanip>
using namespace std; // or std::

int main()
{
    string s1{ "Apple" };
    cout << boolalpha;
    cout << (s1 == "Apple") << endl; //true
}

আমার প্রশ্ন: সিস্টেম কীভাবে এই দুটিয়ের মধ্যে চেক করে? s1সময় একটি অবজেক্ট "Apple"একটি হল সি-শৈলী স্ট্রিং আক্ষরিক।

যতদূর আমি জানি, বিভিন্ন উপাত্তের ধরণের তুলনা করা যায় না। আমি এখানে কি মিস করছি?



2
Fww, যতক্ষণ না এক প্রকারের অন্য ধরণের রূপান্তর করা যায়, আপনি সাধারণত তাদের তুলনা করতে পারেন। আপনি std::stringএকটি সি-স্ট্রিং থেকে একটি সূচনা করতে পারেন ।
— নাথান অলিভার

উত্তর:


16

এটি নিম্নলিখিত তুলনা অপারেটরের জন্য সংজ্ঞায়িত হওয়ার কারণেstd::string

template< class CharT, class Traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs, const CharT* rhs );  // Overload (7)

এটি std::stringএবং এর মধ্যে তুলনার অনুমতি দেয় const char*। এইভাবে যাদু!


@ পিট বেকারের মন্তব্য চুরি করা :

"সম্পূর্ণতার জন্য, যদি এই ওভারলোডটি না উপস্থিত থাকে তবে তুলনাটি এখনও কাজ করবে; সংকলকটি সি-স্টাইলের স্ট্রিংstd::string থেকে টাইপের একটি অস্থায়ী বস্তু তৈরি করবে এবং এর প্রথম ওভারলোডটি ব্যবহার করে দুটি বস্তুর তুলনা করবে std::stringoperator==

template< class CharT, class Traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs,
                 const basic_string<CharT,Traits,Alloc>& rhs );   // Overload (1)

এই কারণেই এই অপারেটরটি (অর্থাত্ ওভারলোড )) সেখানে রয়েছে: এটি সেই অস্থায়ী বস্তুর প্রয়োজনীয়তা এবং এটি তৈরি এবং ধ্বংসের সাথে জড়িত ওভারহেডকে দূর করে ""


8
এবং, সম্পূর্ণতার জন্য, যদি এই ওভারলোডটির অস্তিত্ব না থাকে তবে তুলনাটি এখনও কার্যকর হবে; সংকলক std::string from the C-style string and compare the two std :: স্ট্রিং অবজেক্ট টাইপের একটি অস্থায়ী অবজেক্ট তৈরি করবে । এই অপারেটরটি এখানে কেন রয়েছে: এটি অস্থায়ী বস্তুর প্রয়োজনীয়তা এবং এটি তৈরি এবং ধ্বংসের সাথে জড়িত ওভারহেডকে সরিয়ে দেয়।
— পিট বেকার

1
@ পেটবেকার অবশ্যই, আমি এটি উত্তরে যুক্ত করেছি। নির্দেশ করার জন্য ধন্যবাদ!
— জেজেও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.