String, Iterator Concepts in C++ [part 4]

String, Iterator Concepts in C++ [part 4]

String:

আমরা স্ট্রিং ডিকলার করার জন্য আমরা একটা ক্লাস ব্যবহার করব । যার নাম হচ্ছে string . আমরা ক্লাস সম্পর্কে খুব ভাল ভাবে জেনে এসেছি । তাই এটা আর বুঝতে সমস্যা হওয়ার কথা না ।

আমরা শুধু একটা ক্লাস বা টাইপ বলে দিলেই হবে । আগে জেটা আমাদের srtcpy() দিয়ে করতে হত । এখন আমরা চাইলেই সহজে করতে পারছি । চাইলে ডিক্লার করার সাথে সাথে ভেলু আসাইন করে দিতে পারি আবার চাইলে সেটা পরে করতে পারি ।

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string name = "rashedul";
    cin >> name;
    cout << name << endl;
    return 0;
}

খেয়াল করেছ কিনা । স্ট্রিং ডিক্লার করার সময় সাইজ বলে দিতে হচ্ছে না । এর কারণ হচ্ছে string হচ্ছে একটা dynamic array. এ কি করে ? প্রথমে তার সাইজ ১ আসাইন করে রাখে। পরে যখন আমরা বড় স্ট্রিং দিব তখন সে অনুযায়ী সাইজ বাড়িয়ে নিতে পারে । এটা দেখার জন্য এভাবে দেখতে পারি ।

name.capacity()
cout << name.length() << endl; 
cout << name.max_size() << endl; // কতটুকু ধারণ করতে পারবে ।

cout << name.max_size() << endl;মনে রাখবে আগে যেভাবে স্ট্রিং এর মাঝে স্পেস পাইলে সেটাকে শেষ বলে ধরে নিত । তেমনি এখানেও কাজ করবে ।

এখন তুমি হইত চাঁচ্ছ এমন করতে যে তোমার ১০ সাইজের একটা স্ট্রিং থাকবে যেখানে সবগুলো ইনডেক্স x বা অন্য ক্যারেক্টার দিয়ে পুরনো থাকবে । তাহলে এটা করতে পারি ।

string name(10, 'x'); // xxxxxxxxxx
name[4] = 'p'; // to update ---> xxxxpxxxxx

** কপি করা বা একটার ভেলু আর একটাতে আসাইন করা ।

string name = "rashedul";
string name2 = "islam"
name2 = name;

** concat বা স্ট্রিং যুক্ত করা ।

string name = "rashedul";
string name2 = "islam"
string cnct = name + name2;
cout << cnct;

** equality checking

string name = "hi";
string name2 = " rashedul";
bool isTrue = name == name2;
cout << isTrue << endl; // 0 --> means false

Iterator:

iterator মানে আসলে কি ? যে iterate করতে পারে । এর অর্থ হচ্ছে প্রতিটা ঘরকে একের পর এক পড়া । সে আসলে একটার পর একতা পয়েন্ট করে জায় । একই সাথে iterator একতা পয়েন্টার । স্ট্রিং কে iterate করতে চাইলে নির্দিষ্ট কিছু নিয়ম আছে ।

১। প্রথমে একটা স্ট্রিং এর iterator ডিক্লার করে নিতে হবে with iterator keyword. আমরা ক্লাস থেকে কিভাবে একটা মেথড বের করে আনতে হয় সেঁটা জানি ঠিক সেভাবে কাজ করবে ২। তারপর সেঁতার উপর লুপ চালাতে হবে । ৩। লুপটা কথা থেকে শুরু হবে সেঁতা বলে দিতে হবে । যে নামে iterator টা ডিক্লার করলাম সেঁটা একতা পয়েন্টার । ওকে সুরুর ঘরকে পয়েন্ট করে বলে দিতে হবে, ও যাতে করে সেখান থেকে লুপ শুরু করে । সেক্ষেত্রে c++ একটা build in একটা ফাংশন আছে সেটার নাম begin(), শেষ কোথায় করবে সেঁতা বলে দিতে end() নামে আর একটা ফাংশন আছে ।

** মনে রাখতে হবে এটা বাম থেকে দান দিকে চলবে

#include <bits/stdc++.h>
int main(){
 string name = "rashedul";
 string::iterator it; // it is the name if my iterator. you can declare another name
 for (it = name.begin(); it != name.end(); it++){
     cout << *it << "\t";
  }
}
// r     a     s     h     e     d     u     l

** যদি ডান থেকে বাম দিকে iteration চালাতে চাই তাহলে ।

১। intetaror তাকে reverse হিসেবে ডিক্লার করতে হবে । with reverse_iterator keyword ২। আগে যেখানে begin দিয়ে শুরু করেছিলাম সেখানে rbegin() করে দিব ৩। আগে যেখানে eng দিয়ে শেষ করেছিলাম সেখানে rend() করে দিব

string name = "rashedul";
string::reverse_iterator it;
for (it = name.rbegin(); it != name.rend(); it++){cout << *it << endl;}
//------- এভাবে না করে একলাইনে এভাবে করা যায় --------- 
for ( string::reverse_iterator it = name.rbegin(); it != name.rend(); it++){
   cout << *it << endl;
}

** এই যে iterator কোন দিন থেকে iterate করবে এটা বলে দিতে হচ্ছে । যদি এমন কোন উপায় থাকত যে নিজেই বুঝে নিতে পারবে সে কোণ দিক থেকে কোন থেকে iteration চালাবে । সেটা depent করবে আমরা begin(), end() নাকি rbegin(), rend() ব্যবহার করছি ।

সেটা করার জন্য ব্যবহার করব auto কীওয়ার্ড টি

for ( auto it = name.rbegin(); it != name.rend(); it++){
   cout << *it << endl;
}

String Element Access in C++

string name = "rashedul"
cout << name[6] << endl;
cout << name.at(6) << endl;
cout << name.front() << endl; // name[0] স্ট্রিং এর সামনে যে আছে তাকে দিকে । এক্ষেত্রে r দিকে 
cout << name.back() << endl; // name[name.size() - 1]

String Modifiers in C++

#include <bits/stdc++.h>
using namespace std;
int main(){
    string name = "abc";
    // name.assign("rashedul");
    // ------------- concatenation
    // name += "bye";
    // name.append("bye");
    //--------------------// insert// --------------------
    // name.push_back('bye');
    // name.pop_back(); // লাস্ট থেকে ডিলিট
    // name.insert(1, "inserted");
    // name.erase(1, 2); // কত থেকে কত ডিলিট হবে ।
    //--------------------// swap // --------------------
    // string name2 = "xyz";
    // swap(name, name2);
    //--------------// output // -----------------
    cout << name << endl;
    return 0;
}

String operators in c++:

string name = "abc";
cout << name.find("b") << endl;
cout << name.rfind("b") << endl;// reverse এ দিক থেকে ফাইন্ড করবে অর্থাৎ ডান থেকে বামে 
cout << name.find_first_of("b") << endl; // প্রথম কোথায় পাওয়া গেছে সেঁতা রিটার্ন করবে । 
cout << name.find_first_not_of('a') << endl; // যেখানে প্রথম a কে পাওয়া যায়নি
cout << name.find_last_not_of('a') << endl; //     
cout << name.substr(1, 2) << endl; // কোন অংশ কেটে নেওয়া ।

String stream in c++

এই বিষয়টা js এ string.split() এর মত ;

#include <bits/stdc++.h>
using namespace std;
int main(){
    string name = "a b c df e fet dgdf";
    stringstream stream(name);
   // stringstream stream(name); বদলে  stream << name; এভাবে দিতে পারি । 
    string s;
    while (stream >> s){
        cout << s << endl;
    }
    return 0;
}

end

Did you find this article valuable?

Support Rashedul Islam by becoming a sponsor. Any amount is appreciated!