Professional Documents
Culture Documents
Standard Template Library and Other C++ Stuffs
Standard Template Library and Other C++ Stuffs
Farhan Ahmad, Nafis Ul Haque Shifat, Debojoti Das Soumya and Jarif Rahman
January 7, 2022
1
Contents
1 CP Setup 3
2 Macro 3
3 Lambda Expressions 4
4.1 Pair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.2 Tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5 Array 7
6 Vector 8
7 Deque 10
8 Stack 11
9 Queue 13
10 Set 14
11 Priority Queue 16
12 Mutliset 17
13 Map 19
2
1 CP Setup
Jarif Rahman
Competitive Programming এ আমােদর অেনক তাড়াতািড় েকাড করেত হয়। এ কারেণ বার বার েহডার ইনক্লুড
করা অেনক ঝােমলা হেত পাের। খু িশর খবর হেলা bits/stdc++.h নামক েহডার ফাইল প্রায় সব দরকাির েহডার ফাইল
(েযমন: iostream, vector, string ইতয্ািদ) ইনক্লুড কের েনয়। েয েয ফাইল ইনক্লুড কের তার িলস্ট এখােন পাওয়া
যােব।
C++ এ ইনপুট অউটপুট এর জনয্ আমরা cin আর cout বয্বহার কের থািক। C েত আমরা ইনপুট আর অউটপুট এর
জনয্ printf আর scanf বয্বহার কির। printf আর scanf, cin আর cout এর তু লনায় অেনক ফাস্ট। এই কারেণ
পারেল C++ এও printf আর scanf বয্বহার করা উিচৎ। িকন্তু যিদ েকউ cin আর cout বয্বহার কের অভয্স্ত হেয়
েযেয় থােকা (including me :) ) তাহেল cin আর cout েকও fast I/O নামক ট্রিক বয্বহার কের ফাস্ট করা যায়।
তার জনয্ main ফাংকশান এর শুরুেত এই দুই লাইন েকাড িলখেত হেব:
ios::sync_with_stdio(0);
cin.tie(0);
আর C++ এর লাইন েশষ করার জনয্ endl না বয্বহার কের "\n" বয্বহার কের উিচত। "\n", endl এর েচেয় ফাস্ট
কাজ কের।
#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
//code here
}
2 Macro
Jarif Rahman
C++ এ েকাডেক েছােটা করার জনয্ একটা সুন্দর িফচার হেলা #define। #define বয্বহার কের আমরা একটা macro
িডফাইন করেত পাির। িনেচ িকছু উদাহরণ েদখােনা হেলা।
#define vi vector<int>
#define pi pair<int, int>
#define f first
#define sc second
এখন
pi p = {1, 2};
cout << p.f << " " << p.sc < "\n";
vi v(10, 10);
3
for(int i = 0; i < 10; i++) cout << v[i] << " ";
cout << "\n";
েলখা আর
3 Lambda Expressions
Jarif Rahman
C++ এ লয্াম্বডা এক্সেপ্রশন নােমর ফাংকশােনর মেতা এক ধরেনর এক্সেপ্রশন ৈতির করা যায়। সাধারণত C++ এ সব
ধরেনর ফাংকশান েগ্লাবািল িডেক্লয়ার করেত হয়। িকন্তু লয্াম্বডা এক্সেপ্রশন এর সুিবধা হেলা এটােক েলাকািলও িডেক্লয়ার
করা যায়। এটার িসনটয্াক্স িকছুটা এরকম:
int x = 10;
4
auto sth = [=](int y){
return x+y;
};
cout << sth(1) << "\n"; //11
int X = 1;
auto will_change = [&](){
X++;
};
cout << X << "\n"; //2
//recursive
function<long long(long long)> factorial = [&](long long x){
if(x == 0) return 1LL;
else return x*factorial(x-1);
};
//function type cannot be auto this time
//capture can has to &
//I tried with = and it resulted in seg fault
//I am not sure whether other captures will work or not
cout << factorial(5) << "\n"; //5! = 120
িব.দ্র.: যিদ <bits/stdc++.h> ইনক্লুড না করা হয় তাহেল tuple বয্বহার করেত <tuple> ইনক্লুড করা লাগেব।
4.1 Pair
Pair দুইটা এেলেমন্টেক েস্টার কের রাখেত পাের। একটা অয্ােরও এেলেমন্ট েস্টার কের রাখেত পাের। িকন্তু pair এর
ৈবিশষ্টয্ হেলা এর দুইটা এেলেমন্ট এর টাইপ একই হয়া লাগেব না। Pair েক িডেক্লয়ার করেত হয় এভােব:
pair<type, type>1 । এর প্রথম এেলেমন্টেক first আর িদ্বতীয় এেলেমন্টেক second দ্বারা অয্ােক্সস করা যায়।
(আিম জািন এই কথাগুলা নতু নেদর মাথার উপর িদেয় েযেত পাের :P , িচন্তা কেরা না, কেয়কটা উদাহরণ েদখেলই িঠক
হেয় যােব)।
5
//pair of pairs is also possible, example:
pair<int, pair<int, int>> p3 = {1, {2, 3}};
cout << p3.first << " " << p3.second.first << " " << p3.second.second << "\n";
//1 2 3
Pair এর value সরাসির curly braces ({,}) িদেয় পিরবতর্ন করা যায় এবং pair এর জায়গায় curly braces
বয্বহার কের যায়। তেব কখন কখন curly braces বয্বহার করেল সমসয্া হেত পাের। েযমন ধর p একটা pair ।
if(p < {1, 2}) compilation error িদেব। এরকম সমেয়র জনয্ C++ এ make_pair নােমর একটা ফাংকশান
আেছ। এটা দুইটা এেলেমন্টেক পয্ারািমটার িহেসেব েনয় আর তােদর Pair িরটানর্ কের। আেগর েকাডটার জায়গায় আমরা
if(p < make_pair(1, 2)) বয্বহার করেত পারব।
যখন দুইটা pair েক compare করা হয় (==, !=, <, >, <=, >= ইতয্ািদ দ্বারা, আেগর উদাহরেণও এটা েদখান
হেয়েছ) তখন তােদর েক lexographically compare করা হয়। ধর েকান pair টা বড় িননয় র্ করেত চাচ্ছ। েযটার
ু
প্রথম এেলেমন্ট বড় েসটা বড়। যিদ দইটারই প্রথম এেলেমন্ট সমান হয় তাহেল েযটার িদ্বতীয় এেলেমন্ট বড় েসটা বড়।
অবশয্ই দুইটা Pair েক সমান হেত হেল তােদর দুইটা এেলেমন্টই সমান হেত হেব।
4.2 Tuple
Tuple েক extended Pair বলা যায়। Pair এ মাত্র দুইটা এেলেমন্ট থাকেত পাের। িকন্তু tuple এ ইচ্ছা মত
এেলেমন্ট রাখা যায়।
Tuple এ েযেহতু ইচ্ছা মত এেলেমন্ট থাকেত পাের তাই অবশয্ই তার এেলেমন্টেদর first, second িদেয় এেক্সস করা
যােব না। তােদর এেক্সস করার জনয্ get ফাংকশান বয্বহার করা লাগেব। এর িসনটয্াক্স হেলা: get<index>(tuple)।
আেগর উদাহরণ েক extend করেল পাই:
cout << get<0>(a) << " " << get<1>(a) << "\n"; //1 2
get<0>(a)--;
cout << get<0>(a) << " " << get<1>(a) << "\n"; //0 2
দুইটা tuple েকও যখন compare করা হয় তখন lexographically compare করা হয়। যার প্রথম এেলেমন্ট
বড় েস বড়। দুইটা সমান হেল যার িদ্বতীয় এেলেমন্ট বড় েস বড়। এভােব চলেত থাকেব। সব এেলেমন্ট সমান হেয় েগেল
tuple দুইটা সমান।
Pair বা tuple েথেক বারবার first, last বা get বয্বহার কের এেলেমন্ট এেক্সস করা ঝােমলা হেত পাের। pair
বা tuple এর এেলেমন্ট গুলােক অনয্ েভিরেয়বেল েসভ কের বয্বহার করা েবিশ সুিবধাজনক হেত পাের। েসটােক একটা
6
একটা কেরও করা েযেত পাের িকন্তু C++ এ এটার জনয্ একটা শটর্কাট আেছ। েসটা হেলা tie ফাংকশান। িনেচ tie
ফাংশােনর িকছু উদাহরণ েদখােনা হেলা।
int a, b;
pair<int, int> p = {1, 2};
tie(a, b) = p;
cout << a << " " << b << "\n"; //1 2
যিদ C++17 বয্বহার করা হয় তাহেল আেরা সহেজ এই কাজ করা যােব structured binding বয্বহার কের।
5 Array
Jarif Rahman
িব.দ্র.: C++ array প্রায় useless । এটার সব কাজই C-style অয্াের (েযমন: int a[100]) করেত পাের। িকন্তু
এটা েযেহতু stl এর অংশ তাই এটােক িশখােনা হেচ্ছ।
িব.দ্র.: যিদ <bits/stdc++.h> ইনক্লুড না করা হয় তাহেল array বয্বহার করেত <array> ইনক্লুড করা লাগেব।
Array িডেল্কয়ার করেত হয় এভােব: array<type, size>। এখােন size অবশয্ই ধ্রুবক হেত হেব। অথর্াৎ একটা
সংখয্া হেত হেব অথবা const সহ িডেক্লয়ার করা েভিরেয়বল হেত হেব। C++ array হেলা fixed-size অয্াের। একবার
িডেক্লয়ার করার পর এর সাইজ পিরবতর্ন করা যায় না।
7
আমরা সাধারণত অয্াের এবং অনয্ানয্ STL কেন্টইনার এর এেলেমন্ট বয্বহার করার সময় ইনেডক্স (েযমন: a[5])
বয্বহার কির। িকন্তু েবিশরভাব STL ফাংকশান ইটােরটর বয্বহার কের ইমেপ্লেমন্ট করা। ইটােরটর িকছুটা পেয়ন্টােরর
মেতা কাজ কের। এটা অয্ােরর (এবং অনয্ানয্ কেন্টইনােরর) েকােনা এক এেলেমন্ট এর িদেক পেয়ন্ট কের। অয্ােরর শুরুর
এেলেমেন্টর ইটােরটর পাওয়া যায় arrayName.begin() এর মাধয্েম। েশষ এেলেমেন্টর িঠক পেরর ইটােরটর পাওয়া
যায় arrayName.end() এর মাধয্েম।
Figure 1: ইটােরটর
অয্ােরর ইটােরটর হেলা Random Access Iterator । অথর্াৎ আমরা ইটােরটর এর সােথ সহেজই েযাগ িবেয়াগ করেত
পারেবা।
C++ অয্ােরেক ইনেডক্স করা যায়। তাই এখােন ইটােরটরেক useless মেন হেত পাের। িকন্তু C++ STL এর সব ডাটা
স্ট্রাকচারেক ইনেডক্স করা যায় না (েযমন: set )। তােদর েক্ষেত্র ইটােরটের িদেয়ই কাজ চালােত হয়। সবাইেক ইনেডক্স
করা যায় না িকন্তু সবার ইটােরটর আেছ। তাই C++ এর েবিশরভাগ STL ফাংকশান ইটােরটর িদেয় ইমেপ্লেমন্ট করা।
েযমন:
6 Vector
Nafis Ul Haque Shifat
Vector েক "Resizable Array" বলা যায়। সাধারণ Array এর সাইজ শুরুেতই বেল িদেত হয়, এর সাইজ বাড়ােনা
ও যায় না, িকংবা কমােনা ও যায় না। Vector এর মজার িদক হেচ্ছ যখন ইচ্ছা এর সাইজ বাড়ােনা বা কমােনা যায়, এেত
েযেকােনা সময় নতু ন element েযাগ করা যায়, আবার িরমু ভ ও করা যায়।
8
Initializing:
vector<int> v1; // v1 = {}
vector<int> v2(5); // v2 = {0, 0, 0, 0, 0};
vector<string> v3 = {"hi", "Bangladesh", "hello"};
এখােন <> এর মেধয্ vector িট েকান ধরেণর variable ( েযমন int, char, string) জমা রাখেব তা িলখেত
হয়. Array েত েকােনা এিলেমন্ট েযভােব access করেত হয়, এখােনও েসভােবই!
push_back(): Vector এর েশেষ েকােনা উপাদান েযাগ করেত হয় push_back() ফাংশন িদেয়। এিট con-
stant সময় েনয়, অথর্াৎ এর complexity O(1).
vector<string> v; // v = {};
v.push_back("Hi"); // v = {"HI"}
v.push_back("Hello"); // v = {"Hi", "Hello"}
cout << v[1] << endl; // prints "Hello"
pop_back(): Vector এর েশষ উপাদান pop_back() িদেয় িরমু ভ করা যায়। এিটর ও complexity O(1)
vector<int> v = {1, 2, 5}
v.pop_back(); // v = {1, 2}
v.pop_back(); // v = {1}
size(): বু ঝাই যােচ্ছ, এিট িদেয় vector এর সাইজ েবর করা যায়। এিটর ও complexity O(1)
insert(): push_back() ফাংশনিট দ্বারা শুধু েশেষ েকােনা নতু ন উপাদান যু ক্ত করা যায়, তেব েযেকােনা index
এ নতু ন উপাদানিট বসােত insert() বয্বহার করা যায়। এিট ২ িট parameter েনয়, ১িট হেচ্ছ position (মূ লত ১িট
iterator , যা ঐ position েক িনেদর্শ কের), আেরকিট হেচ্ছ নতু ন উপাদান িটর মান।
এখােন v.begin() + 2 িদেয় ২য় index েক িনেদর্শ করেছ, কােজই v[2] = 10 হেয় যােব। আেগ 2nd index
এ িছল 3 , এখন 3 চেল যােব 3rd index এ, একই ভােব আেগ যার index িছল 3, এখন তার index হেব 4।
9
বু ঝেতই পারছ এই অপােরশেন vector এর অেনকগুেলা উপাদােনর অবস্থান পিরবতর্ন হয়, তাই এিটর complexity
O(1) নয়। যিদ n িট উপাদােনর পিসশন েচঞ্জ হয়, তেব এর complexity O(n).
erase(): এিট অেনকটা insert() এর মতই, শুধু পাথর্কয্ হেচ্ছ এিট উপাদান েযাগ না কের িরমু ভ কের! এর
complexity ও O(n)
clear(): এিট vector এর সবগুিল উপাদান িরমু ভ কের েদয়, কােজই vector িট ফঁাকা হেয় যায়!
প্রথেমই েদখ, তু িম শুরুেত বেল িদেত পারেব না েকান বেক্স কয়িট কের বল যােব। তেব েযেহতু েমাট বল আেছ k িট, তাই
প্রিত বেক্স সেবার্ চ্চ k িট বল ই েযেত পারেব। তাই আমরা k সাইজ এর n িট array িনেত পাির, েসখােন i -তম array
েত থাকেব েকান েকান বল েসই বেক্স িগেয়েছ। তেব লক্ষয্ কর এেত প্রচু র েমমির অপচয় হেচ্ছ। যিদ k = 105 হয়, তেব
আমরা n িট 105 সাইেজর array িনেয়িছ। েকােনা বেক্স ১িট বল েগেলও যতখািন েমমির লাগেব, 105 িট বল েগেলও
ওই বক্স বাবদ ততখািন েমমির ই লাগেছ! যারা complexity বু েঝ তারা জােন এেত O(nk) েমমির লাগেছ!
এই অবস্থা েথেক বঁাচার জনয্ vector রেয়েছ, আমরা n িট vector িনব, শুরুেত প্রিতিট ফঁাকা থাকেব। পের যখন ই
েকােনা বল i -তম বেক্স যােব, তখন i -তম vector এ ওই বলিটর গােয় িলখা সংখয্ািট পুশ কের িদব। এেত েকােনা
বেক্স যতিট বল যােচ্ছ, েসই বক্স বাবদ ততখািন েমমির লাগেছ। েযেহতু েমাট বল আেছ k িট, কােজই েমমির কমেপ্লিক্সিট
দঁাড়ােচ্ছ O(k)! Code অেনকটা এমন হেব-
7 Deque
Debojoti Das Soumya
Deque এর মেধয্ vector এর সব function গুলাই আেছ। শুধু পাথর্কয্টা হেলা এখােন দুইটা function extra
আেছ েসগুেলা হেলা প্রথেম insert ও remove করা যায় (তাই এটা পড়ার আেগ vector সম্পেকর্ েজেন আস)।
10
Construction
push_front()
push_front() বয্বহার কের deque এর শুরুেত নতু ন element insert করা যায়।
deque<int> dq;
dq.push_front(1); // dq = {1}
dq.push_front(2); // dq = {2, 1}
dq.push_back(3); // dq = {2, 1, 3}
cout << dq[0] << " " << dq[1] << " " << dq[2] << "\n"; // 2 1 3
pop_front()
deque<int> dq;
dq.push_front(1); // dq = {1}
dq.push_front(2); // dq = {2, 1}
dq.pop_front(); // dq = {1}
dq.push_back(3); // dq = {1, 3}
dq.pop_back(); // dq = {1}
8 Stack
Nafis Ul Haque Shifat
Stack একিট খু ব ই সাদামাটা data structure । তু িম যিদ অেনকগুেলা েপ্লট একিটর উপর আেরকিট সাজােত থাক,
তেব নতু ন একিট েপ্লট বসােত হেল িনশ্চয়ই সব গুেলা েপ্লেটর উপর নতু ন েপ্লট িট বসােব। আবার একিট েপ্লট সরােত হেলও
িনশ্চয়ই সবার উপেরর েপ্লটিট আেগ সরােব। Stack এর কাজটাও এমন ই! stack এ নতু ন এিলেমন্ট েযাগ করেল (িকংবা
stack এর ভাষায় push করেল) এিট সবার উপের নতু ন এিলেমন্ট বসায়, িরমু ভ করেত হেল (িকংবা stack এর ভাষায়
pop করেল) উপেরর এিলেমন্ট িট ই িরমু ভ হয়।
বু ঝেতই পারছ েয উপাদানিট েশেষ েযাগ হেচ্ছ েসিট সবার আেগ িরমু ভ হেচ্ছ, এই ধরেনর data-structure েক LIFO
(Last In First Out) data-structure বলা হয়।
stack বয্বহার করেত <stack> েহডার ফাইলিট include করেত হয় (অথবা <bits/stdc++.h>)।
#include<stack>
.....
stack<int> a;
stack<string> b;
stack<char> c;
11
Figure 2: stack
এখােন <> এর মেধয্ stack িট েকান ধরেণর variable (েযমন int, char, string) জমা রাখেব তা িলখেত হয়।
push(): stack এ েকােনা এিলেমন্ট েযাগ করেত হয় push() ফাংশন িদেয়। এর complexity O(1)।
stack<int> st; // st = {}
st.push(2); // st = {2}
st.push(1); // st = {2, 1}
pop(): stack উপেরর এিলেমন্ট িরমু ভ করেত হয় pop() িদেয়। এর complexity O(1) ।
stack<int> st; // st = {}
st.push(2); // st = {2}
st.push(1); // st = {2, 1}
st.pop(); // st = {2}
st.pop(); // st = {}
stack<int> st; // st = {}
st.push(2); // st = {2}
st.push(1); // st = {2, 1}
cout << st.top() << endl; // prints 1
st.push(69); // st = {2, 1, 69}
cout << st.top() << endl; // prints 69
stack<int> st; // st = {}
st.push(2); // st = {2}
st.push(1); // st = {2, 1}
cout << st.size() << endl; // prints 2
st.pop(); // st = {2}
cout << st.size() << endl; // prints 2
12
stack এর সব কাজ ই STL Vector িদেয়ই কের েফলা যায়। আবার vector এ index এও access করা যায়
(েযমন v[2] িক আেছ েবর করেত পারব), তেব তা stack এ করা যােব না। stack আর vector এর ফাংশন গুেলার
complexity একই হেলও stack এর েক্ষেত্র constant factor কম, তাই তু লনামূ লক ভােব stack িকছুটা fast
।
9 Queue
Debojoti Das Soumya
Queue েক FIFO (first in first out) data structure বলা হয়। Queue এর speciality হল এখােন
constant time এ প্রথম element remove করা যায় ও queue এর েশেষ নতু ন element add করা যায়।
Construction
push()
push() বয্বহার কের নতু ন element queue এর েশেষ insert করা যায়।
queue<int> q;
q.push(1); // q = {1}
q.push(5); // q = {1, 5}
front()
queue<string> q;
q.push("hello"); // q = {"hello"}
cout << q.front() << "\n"; // prints "hello"
q.push("world"); // q = {"hello", "world"}
cout << q.front() << "\n"; // prints "hello"
back()
queue<string> q;
q.push("hello"); // q = {"hello"}
cout << q.back() << "\n"; // prints "hello"
q.push("world"); // q = {"hello", "world"}
cout << q.back() << "\n"; // prints "world"
13
size()
queue<int> q;
cout << q.size() << "\n"; // prints 0
q.push(100); // q = {100}
cout << q.size() << "\n"; // prints 1
q.push(5); // q = {100, 5}
cout << q.size() << "\n"; // prints 2
empty()
size() এই function queue empty িকনা তার উত্তের একিট boolean return কের। true মােন empty
এবং false মােন not empty.
queue<int> q;
cout << q.empty() << "\n"; // prints 1
q.push(5);
cout << q.empty() << "\n"; // prints 0
pop()
queue<int> q;
q.push(5); // q = {5}
q.pop(); // q = {}
q.push(50); // q = {50}
q.push(60); // q = {50, 60}
q.push(100); // q = {50, 60, 100}
cout << q.size() << "\n"; // prints 3
cout << q.front() << "\n"; // prints 50
q.pop(); // q = {60, 100}
cout << q.size() << "\n"; // prints 2
cout << q.front() << "\n"; // prints 60
10 Set
Farhan Ahmad
Set শব্দিটর সােথ েতামরা হইত সবাই পিরিচত গিণত বইেয়র মাধয্েম। িকছু বস্তুর সমােবশ বা সংগ্রহ েক set বলা হয়।
C++ এ এই সংজ্ঞা অনুসাের একিট in-built STL data-structure রেয়েছ। এই in-build data-structure
(set) এর িকছু ৈবিশষ্টয্ েদওয়া হল:
14
• Set এর মেধয্ েকান একিট element েক একবার insert করেল, ওই element আর modify করা
সম্ভব নয়। তেব element িটেক remove কের, আবার modified element েক insert করা যােব।
Syntax:
datatype িদেয় value type িনেদর্শ কের। উদাহরণস্বরূপ: int, float, char, etc.
িকছু উদাহরণ:
• count(): function িট set এর মেধয্ েকান element আেছ নািক, return কের। *
েযগুেলা েত * েদওয়া আেছ, ওই সব funtion এর time complexity O(log(N )) এবং বািকেদর O(1) |
িকছু উদাহরণ েদওয়া হল:
s.insert(2);// {2}
s.insert(5);// {2, 5}
s.insert(3);// {2, 3, 5}
s.insert(2);// {2, 3, 5}
15
cout << s.size() << endl; // outputs 2
auto it = s.end();
it--;
cout << *it << endl;// outputs 100
11 Priority Queue
Debojoti Das Soumya
Priority queue হেলা এমন ডাটা স্ট্রাকচার েযখােন element গুেলা একটা িনির্দষ্ট order এ sort করা থােক।
এই ডাটা স্ট্রাকচাের নতু ন element insert ও এই order অনুযায়ী sort করেল েয প্রথম element পাওয়া
যােব েসটা access করা যায় ও remove করা যায়।
Construction
Priority queue েক এভােব declare করা হয়। েকােনা custom comparator include না করেল সাধারণত
বড় েথেক েছাট ক্রেম সাজােনা থােক।
push()
এই function বয্বহার কের priority queue েত নতু ন element insert করা যােব O(log n) time
এ েযখােন n হেলা priority queue এর size ।
priority_queue<int> pq;
pq.push(1); // pq = {1}
pq.push(2); // pq = {2, 1}
top()
priority_queue<int> pq;
pq.push(1); // pq = {1}
cout << pq.top() << endl; // prints 1
16
pq.push(4); // pq = {4, 1}
cout << pq.top() << endl; // prints 4
pop()
এই function priority queue এর প্রথম element remove করেব O(log n) time এ েযখােন n
হেলা priority queue এর size ।
priority_queue<string> pq;
pq.push("a"); // pq = {"a"}
pq.push("ab"); // pq = {"ab", "a"}
pq.push("b"); // pq = {"b", "ab", "a"}
cout << pq.top() << endl; // prints "b"
pq.pop(); // pq = {"ab", "a"}
cout << pq.top() << endl; // prints "ab"
pq.pop(); // pq = {"a"}
cout << pq.top() << endl; // prints "a"
size()
priority_queue<int> pq;
cout << pq.size() << endl; // prints 0
pq.push(4); // pq = {4}
cout << pq.size() << endl; // prints 1
12 Mutliset
Farhan Ahmad
Multiset ও অেনকটা set এর মেতা, এখােন শুধু একই element এেকর অিধক বার থাকেত পাের। Multiset
এর িকছু ৈবিশষ্টয্ েদওয়া হল:
• Multiset এর মেধয্ েকান একিট element েক একবার insert করেল, ওই element আর modify
করা সম্ভব নয়। তেব element িটেক remove কের, আবার modified element েক insert করা
যােব।
Syntax:
17
datatype িদেয় value type িনেদর্শ কের। উদাহরণস্বরূপ: int, float, char, etc.
িকছু উদাহরণ:
েযগুেলা েত * েদওয়া আেছ, ওই সব funtion এর time complexity O(log(N )) এবং বািকেদর O(1) |
িকছু উদাহরণ েদওয়া হল:
m.insert(2);// {2}
m.insert(5);// {2, 5}
m.insert(3);// {2, 3, 5}
m.insert(2);// {2, 2, 3, 5}
m.insert(3); // {3, 3, 5}
m.insert(3); // {3, 3, 3 , 5}
18
cout << endl;
auto it = m.end();
it--;
cout << *it << endl;// outputs 100
13 Map
Jarif Rahman
সাধারণত আমরা array, vector বা deque যাই বয্বহার কির না েকন, এেদর ইনেডক্স একটা পূণর্সংখয্া হয় এবং এর মান
0 এবং কেন্টইনার এর সাইজ মােঝ হয়। িকন্তু map এ ইনেডক্স এমন েযেকােনা ডাটা স্ট্রাকচার হেত পাের যােদরেক "<"
দ্বারা compare করা যায় (েযমন: int, long long, float, pair, tuple, string ইতয্ািদ)। এবং এেদর
মান েযেকােনা হেত পাের। Map এ ইনেডক্স গুলােক key বলা হয়। Map, set এর মেতা স্ট্রাকচার বয্বহার কের।
এর প্রেতয্কটা key এর মান েবর করেত, মান পিরবতর্ন করেত এবং নতু ন key insert করেত O(log n) সময় লােগ
েযখােন n হেলা map টার বতর্মান সাইজ। map সবসময় েসট এর মেতা sorted থােক। map েক িডেক্লয়ার করেত
হয় এভােব: map<keyType, valueType>।
cout << mp1.size() << " " << mp2.size() << " " << mp3.size() << " " << mp4.size()
<< mp5.size() << "\n"; // 1 1 3 2 0
েযেহতু map এ েকােনা key এর মান না থাকেল তার জনয্ default মান েসট কের েদয়া হয় তাই শুধু [] বয্বহার কের
েকােনা key map টােত আেছ িক না তা িননয়
র্ করা ঝােমলা। এই যায়গায় map.find() ফাংকশানটা বয্বহার করা েযেত
19
পাের। েযই ফাংকশানটা েকােনা key এর ইটােরটর িরটানর্ কের। যিদ key টা না থােক তাহেল map.end() িরটানর্ কের।
C++ এর set এর ইটােরটর Random Access Iterator না। আমরা এর ইটােরটর এর সােথ চাইেলই েযেকােনা
সংখয্া েযাগ করেত বা িবেয়াগ করেত পাির না। আবার দুইটা ইটােরটর এর দূরত্বও িননয়
র্ করেত পাির না। যিদ s একটা
set হয়, s.begin()+2, s.end()-2, any_set_iterator-s.begin() এগুলা compilation error িদেব।
আমরা শুধু ++ অথবা -- কের এক এক কের বারােত বা কমােত পাির। এই কাজ গুলা করার জনয্ C++ এ prev, next
এবং distance নােমর ফাংকশান আেছ। িকন্তু এরা worst case এ O(n) সময় েনয়। Set এর ইটােরটর Random
Access না হওয়ায় এেদর ইনেডক্সও করা যায় না। এই সমসয্া সমাধােনর এর জনয্ Policy-based data struc-
tures বয্বহার করা যায়। G++ compiler C++ STL ডাটা স্ট্রাকচার বােদও আেরা িকছু ডাটা স্ট্রাকচার suupport
কের। এেদর Policy-based data structures বলা হয়। Policy-based data structures বয্বহার করেত
হেল <ext/pb_ds/assoc_container.hpp> ইনক্লুড করা লাগেব আর __gnu_pbds namespace বয্বহার করা
লাগেব। অথর্াৎ:
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template<class T>
using indexed_set = tree<T,null_type,less<T>,rb_tree_tag,
tree_order_statistics_node_update>;
indexed set এ set এর সব ফাংকশান ছারাও আেরা িকছু ফাংকশান বয্বহার করা যােব। েযমন:
s.find_by_order(i), s এর iতম এেলেমেন্টর ইটােরেটার িরটানর্ করেব। আবার s.order_of_key(x), x এর
ইনেডক্স িরটানর্ করেব।
indexed_set<int> s;
s.insert(2);
s.insert(3);
s.insert(5);
s.insert(-1);
s.insert(4);
for(int x: s) cout << x << " "; cout << "\n"; //-1 2 3 4 5
20
cout << *s.find_by_order(2) << "\n"; //3
cout << *s.find_by_order(3) << "\n"; //4
উেল্লখয্ েয এই indexed set এর constant factor set এর েচেয় অেনক েবিশ। তাই িবনা কারেণ indexed
set বয্বহার করা উিচত না।
21