C++ এ স্ট্রিং ভিউ

C E Strim Bhi U



C++ প্রোগ্রামিং-এর ক্ষেত্রে, দক্ষতা এবং কর্মক্ষমতাকে অগ্রাধিকার দেওয়া অত্যন্ত গুরুত্বপূর্ণ। C++17 এ প্রবর্তিত “std::string_view” ক্লাসটি ঐতিহ্যগত স্ট্রিং ম্যানিপুলেশনের একটি বহুমুখী এবং মেমরি-দক্ষ বিকল্প উপস্থাপন করে। এর মূল অংশে, 'std::string_view' অক্ষরগুলির একটি অনুক্রমের মালিকানাহীন রেফারেন্স, সাধারণত একটি বড় স্ট্রিংয়ের একটি সাবস্ট্রিংকে প্রতিনিধিত্ব করে। 'std::string' এর বিপরীতে যা তার ডেটার মালিক এবং অভ্যন্তরীণভাবে মেমরি পরিচালনা করে, 'std::string_view' অন্তর্নিহিত ডেটার মালিকানা ছাড়াই কাজ করে। এই বৈশিষ্ট্যটি এমন পরিস্থিতিতে বিশেষভাবে মূল্যবান করে তোলে যেখানে মেমরির অনুলিপি বা পরিচালনার ওভারহেড অবাঞ্ছিত। এই নিবন্ধে, আমরা C++ এ “std::string_view”-এর ব্যবহার বোঝার জন্য বিভিন্ন উদাহরণ অন্বেষণ করব।

উদাহরণ 1: দক্ষ স্ট্রিং হ্যান্ডলিং

আধুনিক C++ ডেভেলপমেন্টে, কর্মক্ষমতা ও সম্পদের ব্যবহার অপ্টিমাইজ করার জন্য দক্ষ স্ট্রিং হ্যান্ডলিং অত্যন্ত গুরুত্বপূর্ণ। এটি মেমরি পুনঃঅবস্থান বা নকলের প্রয়োজন ছাড়াই স্ট্রিংগুলির একটি দক্ষ অ্যাক্সেস এবং ম্যানিপুলেশনের অনুমতি দেয়। এই ধারণাটি ব্যাখ্যা করার জন্য, আসুন একটি ব্যবহারিক উদাহরণে অনুসন্ধান করা যাক।







নিম্নলিখিত কোড স্নিপেট বিবেচনা করুন:



# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন

void processStringView ( std::string_view strView ) {

std::cout << 'দৈর্ঘ্য:' << strView.length ( ) << std::endl;
std::cout << 'বিষয়বস্তু:' << strView << std::endl;
}

int প্রধান ( ) {

std::string originalString = 'দক্ষ স্ট্রিং হ্যান্ডলিং' ;

std::string_view viewOfString ( মূল স্ট্রিং ) ;

processStringView ( viewOfString ) ;

ফিরে 0 ;
}


এই উদাহরণে, আমাদের কাছে 'processStringView' ফাংশন রয়েছে যা 'std::string_view' এর প্যারামিটার হিসেবে নেয়। ফাংশন তারপর স্ট্যান্ডার্ড আউটপুট ব্যবহার করে স্ট্রিং ভিউ এর দৈর্ঘ্য এবং বিষয়বস্তু প্রিন্ট করে। প্রধান ফাংশনটি 'দক্ষ স্ট্রিং হ্যান্ডলিং' মান সহ 'অরিজিনাল স্ট্রিং' নামের 'std::স্ট্রিং' শুরু করে। পরবর্তীকালে, 'std::string_view' নামের 'viewOfString' তৈরি করা হয়, যা 'originalString' এর বিষয়বস্তুকে উল্লেখ করে।



'processStringView' ফাংশনে 'viewOfString' পাস করার মাধ্যমে, আমরা অতিরিক্ত মেমরি বরাদ্দের প্রয়োজনীয়তা দূর করে, দক্ষতার সাথে স্ট্রিংটির অপারেশনগুলি সম্পাদন করতে পারি। 'std::string_view' হল ডাটা কপি না করে 'originalString' এর অন্তর্নিহিত অক্ষর ক্রমটির একটি হালকা রেফারেন্স।





এখানে উত্পন্ন আউটপুট আছে:



উদাহরণ 2: লিগ্যাসি কোডের সাথে ইন্টারঅপারেবিলিটি

C++ বিকাশের ক্ষেত্রে, নতুন এবং পুরানো কোডবেসগুলির বিরামহীন একীকরণ প্রায়শই একটি গুরুত্বপূর্ণ উদ্বেগের বিষয়। 'std::string_view' ডেভেলপারদের লিগ্যাসি ফাংশনগুলির সাথে অনায়াসে ইন্টারঅ্যাক্ট করতে দেয় যা 'const char' পয়েন্টার ফিরিয়ে দেয়।

নিম্নলিখিত উদাহরণটি বিবেচনা করুন যা ইন্টারঅপারেবিলিটির জন্য 'std::string_view' এর ব্যবহারিক ব্যবহার প্রদর্শন করে। এখানে, আমাদের কাছে 'legacyFunction()' নামে একটি লিগ্যাসি ফাংশন রয়েছে যা একটি 'const char' পয়েন্টার প্রদান করে:

# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন

const char * লিগ্যাসি ফাংশন ( ) {
ফিরে 'লেগ্যাসি স্ট্রিং' ;
}

int প্রধান ( ) {

std::string_view legacyStrView ( লিগ্যাসি ফাংশন ( ) ) ;

std::cout << 'লেগ্যাসি স্ট্রিং ভিউ:' << legacyStrView << std::endl;

ফিরে 0 ;
}


আমরা “legacyFunction()” নামের একটি লিগ্যাসি ফাংশন সংজ্ঞায়িত করে শুরু করি যা একটি “const char” পয়েন্টার প্রদান করে যা একটি স্ট্রিংকে প্রতিনিধিত্ব করে যেটিকে “Legacy String” হিসেবে লেবেল করা হয়েছে। আমাদের আধুনিক C++ প্রোগ্রামে এই লিগ্যাসি ডেটা নিরবিচ্ছিন্নভাবে অন্তর্ভুক্ত করার জন্য, আমরা 'std::string_view' ব্যবহার করি। main() ফাংশনে, বিশেষ করে, আমরা 'legacyStrView' নামে 'std::string_view' এর একটি উদাহরণ তৈরি করি এবং এটিকে লিগ্যাসি ফাংশনের ফলাফল দিয়ে শুরু করি। এই ইনস্ট্যান্টেশন আমাদেরকে দক্ষতার সাথে এনক্যাপসুলেট করতে এবং লিগ্যাসি 'const char' পয়েন্টারের সাথে কাজ করতে দেয়।

ফলস্বরূপ, আমরা অপ্রয়োজনীয় ডেটা অনুলিপি না করে, দক্ষতা এবং সামঞ্জস্য উভয়ই সংরক্ষণ না করেই উত্তরাধিকার স্ট্রিং অ্যাক্সেস এবং ম্যানিপুলেট করতে পারি। কোডের চূড়ান্ত ধাপে লিগ্যাসি স্ট্রিং ভিউয়ের বিষয়বস্তু প্রিন্ট করতে 'std::cout' ব্যবহার করা জড়িত।

সম্পাদিত আউটপুট হল:

উদাহরণ 3: উন্নত স্ট্রিং লিটারেল হ্যান্ডলিং

C++ এ স্ট্রিং লিটারেলগুলি ঐতিহ্যগতভাবে অক্ষরের অ্যারে হিসাবে উপস্থাপন করা হয়। 'std::string_view' একটি সুবিধাজনক ইন্টারফেস প্রদান করে স্ট্রিং লিটারালের সাথে কাজ করা সহজ করে। সুস্পষ্ট রূপান্তরের প্রয়োজন ছাড়াই অন্তর্নিহিত অক্ষর অ্যারেতে সরাসরি অ্যাক্সেসের অনুমতি দিয়ে, 'std::string_view' স্ট্রিং লিটারেলে ক্রিয়াকলাপগুলিকে স্ট্রিমলাইন করে৷

# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন

int প্রধান ( ) {
const char * myLiteral = 'হ্যালো, স্ট্রিং ভিউ!' ;
std::string_view literalView ( আমার লিটারাল ) ;

std::cout << 'প্রথম চরিত্র:' << আক্ষরিক দৃশ্য [ 0 ] << std::endl;

size_t অবস্থান = literalView.find ( 'স্ট্রিং' ) ;
std::cout << 'সাবস্ট্রিং পজিশন:' << অবস্থান << std::endl;

ফিরে 0 ;
}


এই উদাহরণে, একটি 'হ্যালো, স্ট্রিং ভিউ!' স্ট্রিং লিটারেল 'myLiteral' পয়েন্টারে বরাদ্দ করা হয়েছে। 'std::string_view' এর প্রবর্তন এই স্ট্রিংটির বিষয়বস্তু অনুলিপি করার প্রয়োজন ছাড়াই এর আরও দক্ষ উপস্থাপনাকে সহজতর করে। 'লিটারালভিউ' অবজেক্টটি 'মাইলিটারাল' পয়েন্টার ব্যবহার করে তৈরি করা হয়েছে যা আমাদের অন্তর্নিহিত অক্ষর ক্রমটি দেখতে এবং ম্যানিপুলেট করতে দেয়।

'std::string_view'-এর ব্যবহার স্ট্রিং-এর মধ্যে স্বতন্ত্র অক্ষরগুলিতে একটি সহজ অ্যাক্সেস প্রদান করে। কোড স্নিপেটে, 'লিটারালভিউ[0]' স্ট্রিংয়ের প্রথম অক্ষরটি পুনরুদ্ধার করে এবং মুদ্রণ করে, উপাদানগুলি অ্যাক্সেস করার সরলতা এবং প্রত্যক্ষতা প্রদর্শন করে। 'std::string_view' এর 'find' পদ্ধতিটি মূল স্ট্রিং এর মধ্যে 'স্ট্রিং' সাবস্ট্রিং এর অবস্থান নির্ধারণ করতে নিযুক্ত করা হয়।

উদাহরণ 4: সাবস্ট্রিং এক্সট্রাকশন

সাবস্ট্রিং নিষ্কাশনের কাজটি নির্দিষ্ট মানদণ্ডের উপর ভিত্তি করে একটি প্রদত্ত স্ট্রিংয়ের একটি অংশ পুনরুদ্ধার করে যেমন একটি বিভাজনের অবস্থান। অনায়াসে সাবস্ট্রিংগুলি বের করার ক্ষমতা 'std::string_view' এর একটি শক্তিশালী বৈশিষ্ট্য। একটি দৃশ্যকল্প বিবেচনা করুন যেখানে আমাদের একটি বিভাজনের উপর ভিত্তি করে একটি স্ট্রিংয়ের একটি অংশ বের করতে হবে:

# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন

int প্রধান ( ) {
std::string fullString = 'আপেল-কমলা-কলা' ;
size_t delimiterPos = fullString.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 , delimiterPos ) ;

std::cout << 'এক্সট্রাক্টেড সাবস্ট্রিং:' << সাবস্ট্রিং << std::endl;

ফিরে 0 ;
}


এই কোড স্নিপেটে, আমরা একটি আসল স্ট্রিং, 'পূর্ণ স্ট্রিং' ঘোষণা দিয়ে শুরু করি, যা 'আপেল-কমলা-কলা' মান দিয়ে শুরু করা হয়। আমাদের লক্ষ্য হল সাবস্ট্রিং নিষ্কাশন করা। এটি অর্জনের জন্য, আমরা C++ স্ট্যান্ডার্ড লাইব্রেরি দ্বারা প্রদত্ত 'ফাইন্ড' ফাংশন নিযুক্ত করি।

একবার আমরা 'delimiterPos' ভেরিয়েবলে সংরক্ষিত 'fullString'-এর মধ্যে ডিলিমিটারের অবস্থান শনাক্ত করলে, আমরা কাঙ্খিত সাবস্ট্রিং বের করি। 'সাবস্ট্রিং' ফাংশনটিকে মূল স্ট্রিং-এ বলা হয়, শুরুর অবস্থান (0) এবং সাবস্ট্রিংয়ের দৈর্ঘ্য নির্দিষ্ট করে যা অবিকল বিভাজনের অবস্থান। এই ক্রিয়াকলাপের ফলে 'sbString' নামে 'std::string_view' তৈরি হয় যা মূল স্ট্রিংয়ের অংশকে শুরু থেকে ডেলিমিটার পর্যন্ত উপস্থাপন করে।

উদাহরণ 5: মেমরি-দক্ষ ডেটা স্ট্রাকচার

মেমরি-দক্ষ ডেটা স্ট্রাকচার ডিজাইন করার ক্ষেত্রে 'std::string_view' একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। স্ট্রিংগুলির একাধিক কপি সংরক্ষণ করার পরিবর্তে, ডেটা স্ট্রাকচারগুলি 'std::string_view' উদাহরণগুলি সংরক্ষণ করতে পারে, এইভাবে মেমরি ওভারহেড হ্রাস করে।

# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন

struct রেকর্ড {
std::string_view নাম;
int বয়স;
} ;

int প্রধান ( ) {

রেকর্ড ব্যক্তি = { 'জন ডো' , 30 } ;

std::cout << 'নাম:' << ব্যক্তি.নাম << ', বয়স:' << ব্যক্তি.বয়স << std::endl;

ফিরে 0 ;
}


এই কোড স্নিপেটে, আমরা একটি মেমরি-দক্ষ ডেটা কাঠামোর মধ্যে 'std::string_view' এর ব্যবহার প্রদর্শন করি। আমরা একটি 'রেকর্ড' কাঠামো সংজ্ঞায়িত করি যার মধ্যে একটি 'std::string_view' সদস্য রয়েছে যার নাম 'নাম' এবং একটি পূর্ণসংখ্যা সদস্য 'বয়স'। এই প্রসঙ্গে 'std::string_view' ব্যবহার আমাদের অতিরিক্ত মেমরি বরাদ্দের প্রয়োজন ছাড়াই একটি স্ট্রিংয়ের একটি হালকা উপস্থাপনা তৈরি করতে দেয়।

'প্রধান' ফাংশনে, আমরা 'জন ডো' নাম এবং 30 বছর বয়সের সাথে 'ব্যক্তি' নামে একটি 'রেকর্ড' অবজেক্ট ইনস্ট্যান্ট করি। নামের সাথে সম্পর্কিত অক্ষর ডেটা, স্ট্রিং বিষয়বস্তু নকল করার প্রয়োজনীয়তা দূর করে। “std::cout << “নাম: ” << person.name << “, বয়স: ” << person.age << std::endl;” বিবৃতিটি 'রেকর্ড' অবজেক্টে সংরক্ষিত ব্যক্তির নাম এবং বয়স প্রকাশ করে।

উপসংহার

C++ বিকাশের ক্রমবর্ধমান ল্যান্ডস্কেপে, 'std::string_view' প্রোগ্রামারের টুলকিটে একটি মূল্যবান সংযোজন হিসাবে দাঁড়িয়েছে। এই নিবন্ধে যে দৃষ্টান্তগুলি চিত্রিত করা হয়েছে সেগুলি C++ প্রোগ্রামিং-এর ক্ষেত্রে “std::string_view”-এর অভিযোজনযোগ্যতা এবং উপযোগিতা তুলে ধরে। দক্ষ স্ট্রিং ম্যানিপুলেশন এবং লিগ্যাসি কোড সহ নিরবিচ্ছিন্ন আন্তঃঅপারেবিলিটি থেকে মেমরি-দক্ষ ডেটা স্ট্রাকচার পর্যন্ত, 'std::string_view' বিকাশকারীদের জন্য মূল্যবান যারা বিভিন্ন পরিস্থিতিতে উন্নত কর্মক্ষমতা এবং অপ্টিমাইজ করা কোড খুঁজছেন৷ এই বাস্তব-বিশ্বের পরিস্থিতিগুলি দেখায় যে কীভাবে 'std::string_view' কোডটি অপ্টিমাইজ করতে পারে, অপ্রয়োজনীয় মেমরি ওভারহেড কমাতে পারে এবং C++ অ্যাপ্লিকেশনগুলির সামগ্রিক দক্ষতায় অবদান রাখতে পারে।