STL కంటైనర్లు & అల్గారిథమ్స్
కంప్యూటర్ ప్రోగ్రామింగ్ ప్రపంచంలో చక్రాలను మళ్లీ మళ్లీ కనుక్కోవడం (Reinventing the Wheel) కంటే అమూల్యమైన సమయాన్ని హరించే తప్పు మరొకటి ఉండదు. ఒక ప్రోగ్రామర్కు డేటా స్ట్రక్చర్స్ అయిన డైనమిక్ అర్రేలు, లింక్డ్ లిస్టులు, బైనరీ ట్రీలు, హ్యాష్ టేబుల్స్, లేదా క్విక్సార్ట్ అల్గారిథమ్స్ అవసరమైన ప్రతిసారీ మొదటి నుండి కోడ్ రాయకుండా, ప్రపంచంలోని అత్యున్నత కంప్యూటర్ శాస్త్రవేత్తలు పరిశోధించి రాసిన అత్యంత శక్తివంతమైన లైబ్రరీయే C++ STL (Standard Template Library).
STL లో ప్రధానంగా మూడు మూలస్తంభాలు ఉన్నాయి: డేటాను నిల్వ చేసే కంటైనర్లు (Containers), ఆ డేటాను నావిగేట్ చేసే ఇటరేటర్లు (Iterators), మరియు మెరుపు వేగంతో ప్రాసెస్ చేసే అల్గారిథమ్స్ (Algorithms). వీటితో పాటే రన్-టైమ్ క్యూయింగ్ కోసం std::priority_queue, సెర్చింగ్ కోసం O(1) Hash Maps, మరియు C++20 లో వచ్చిన అధునాతన రేంజ్ పైప్లైన్లు ఉన్నాయి.
ఈ సమగ్ర మాస్టర్క్లాస్లో మనం std::vector యొక్క అండర్లైయింగ్ మెమరీ గ్రోత్, std::map vs std::unordered_map అంతర్గత ట్రీ & హ్యాష్ మెకానిక్స్, Iterator Invalidation ప్రమాదాలు, కోర్ అల్గారిథమ్స్, మరియు పూర్తి స్థాయి "Enterprise E-Commerce Order Fulfilment & Search Analytics Engine" ప్రాజెక్ట్ను ప్రత్యక్షంగా నిర్మించి ప్రావీణ్యం సంపాదిద్దాం!
1 STL ఆర్కిటెక్చర్ అంటే ఏమిటి? (The Stepanov Triad)
STL (Standard Template Library) ని 1990లలో అలెక్సాండర్ స్టెపనోవ్ (Alexander Stepanov) అనే దిగ్గజ కంప్యూటర్ శాస్త్రవేత్త రూపొందించారు.
స్టెపనోవ్ ఒక విప్లవాత్మకమైన ప్రశ్న వేశారు: "డేటా స్ట్రక్చర్ మరియు అల్గారిథమ్స్ మధ్య గట్టి బంధం (Tight Coupling) ఎందుకు ఉండాలి? ఒక సార్టింగ్ అల్గారిథమ్ అర్రేలపైనా, లింక్డ్ లిస్టులపైనా ఒకే విధంగా పనిచేసేలా ఎందుకు చేయకూడదు?"
ఆ ఆలోచన నుండే STL త్రిమూర్తుల నిర్మాణం జన్మించింది:
- కంటైనర్లు (Containers): డేటాను భద్రపరిచే భాండాగారాలు (ఉదా:
vector,list,map). - ఇటరేటర్లు (Iterators): కంటైనర్కు మరియు అల్గారిథమ్కు మధ్య వారధిగా పనిచేసే స్మార్ట్ పాయింటర్లు.
- అల్గారిథమ్స్ (Algorithms): డేటాపై పనిచేసే ఫంక్షన్లు (ఉదా:
std::sort,std::find,std::transform).
2 సీక్వెన్స్ కంటైనర్లు: std::vector (The Undisputed King)
C++ ప్రోగ్రామర్ నిత్య జీవితంలో 90% సమయం ఉపయోగించే కంటైనర్ std::vector. ఇది హీప్ మెమరీలో కంటిగ్యువస్ (వరుస) బ్లాక్లో డేటాను భద్రపరుస్తుంది.
Size వర్సెస్ Capacity & Geometric Growth:
size(): ప్రస్తుతం వెక్టార్లో ఎన్ని ఎలిమెంట్లు ఉన్నాయి.capacity(): మెమరీని రీ-అలొకేట్ చేయకుండా గరిష్టంగా ఎన్ని ఎలిమెంట్లను ఉంచగలదు.- ఎలిమెంట్లు నిండిపోయినప్పుడు కంపైలర్ కెపాసిటీని రెట్టింపు (2x Geometric Growth) చేస్తుంది: పాత మెమరీ నుండి కొత్త మెమరీకి కాపీ చేసి పాత దాన్ని డిలీట్ చేస్తుంది.
vec.reserve(10000); వాడండి! దీనివల్ల అనవసరమైన డబులింగ్ రీ-అలొకేషన్లు మరియు మెమరీ కాపీలు ఆగిపోయి ప్రోగ్రామ్ 5x వేగవంతమవుతుంది.
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers;
numbers.reserve(5); // 5 ఎలిమెంట్లకు ముందుగానే కెపాసిటీ లాక్!
std::cout << "ప్రారంభ సైజ్: " << numbers.size() << " | కెపాసిటీ: " << numbers.capacity() << "\n";
for (int i = 1; i <= 5; ++i) {
numbers.push_back(i * 10);
std::cout << "ఐటెమ్ జోడించబడింది: " << (i * 10)
<< " -> Size: " << numbers.size() << " | Capacity: " << numbers.capacity() << "\n";
}
// emplace_back: ఆబ్జెక్ట్ను ఇన్-ప్లేస్ గా నిర్మిస్తుంది (కాపీ సున్నా!)
numbers.emplace_back(60); // ఇప్పుడు కెపాసిటీ రెట్టింపు అవుతుంది!
std::cout << "60 చేర్చిన తర్వాత -> Size: " << numbers.size() << " | Capacity: " << numbers.capacity() << "\n";
return 0;
}
3 std::deque & std::list (Double-Ended Queue vs Doubly Linked List)
| కంటైనర్ | అంతర్గత డేటా స్ట్రక్చర్ | ముందు/వెనుక ఇన్సర్షన్ (O(1)) |
మధ్యలో ఇన్సర్షన్ | CPU Cache Locality |
|---|---|---|---|---|
std::vector |
Contiguous Dynamic Array | వెనుక మాత్రమే O(1); ముందు O(N) |
O(N) (ఎలిమెంట్స్ షిఫ్ట్ అవ్వాలి) |
ఉత్తమమైనది (10/10) |
std::deque |
Chunked Memory Blocks (Array of Buffers) | ముందు & వెనుక రెంటిలోనూ O(1) |
O(N) |
మంచిది (8/10) |
std::list |
Doubly Linked List (Nodes with prev/next pointers) | ముందు & వెనుక రెంటిలోనూ O(1) |
ఇటరేటర్ ఉంటే O(1) |
చాలా తక్కువ (పాయింటర్ చేజింగ్ వల్ల Cache Misses) |
4 కంటైనర్ అడాప్టర్లు: std::stack, std::queue, std::priority_queue
కంటైనర్ అడాప్టర్లు నేరుగా మెమరీని మేనేజ్ చేయవు; అవి వెక్టార్ లేదా డెక్ పైన నిర్దిష్టమైన ఇంటర్ఫేస్ను అందిస్తాయి:
std::stack: LIFO (Last-In, First-Out) -push(),pop(),top().std::queue: FIFO (First-In, First-Out) -push(),pop(),front().std::priority_queue: Max-Heap ఆర్కిటెక్చర్. ఎలిమెంట్లను ఇన్సర్ట్ చేసినప్పుడు అత్యధిక ప్రాధాన్యత (గరిష్ట విలువ) కలిగిన ఎలిమెంట్ ఎల్లప్పుడూ పైకి (O(log N)) వస్తుంది.
#include <iostream>
#include <queue>
#include <string>
struct HospitalPatient {
std::string name;
int triagePriority; // 10: అత్యవసరం (ICU), 1: సాధారణం
// Priority Queue కొరకు < ఆపరేటర్ ఓవర్లోడింగ్!
bool operator<(const HospitalPatient& other) const {
return triagePriority < other.triagePriority; // Max-heap కొరకు
}
};
int main() {
std::priority_queue<HospitalPatient> erQueue;
erQueue.push({"రోగి A (సాధారణ జ్వరం)", 2});
erQueue.push({"రోగి B (గుండెపోటు - ICU)", 10});
erQueue.push({"రోగి C (ఎముక విరిగింది)", 6});
std::cout << "===== అత్యవసర ఎమర్జెన్సీ వార్డ్ ట్రియేజ్ ఆర్డర్ =====\n";
while (!erQueue.empty()) {
HospitalPatient p = erQueue.top();
std::cout << "🚨 చికిత్స జరుగుతోంది: " << p.name << " [ప్రాధాన్యత: " << p.triagePriority << "]\n";
erQueue.pop();
}
return 0;
}
5 అసోసియేటివ్ కంటైనర్లు: std::set & std::map (Red-Black Trees: O(log N))
కీ-విలువ జతలను (Key-Value Pairs) ఎల్లప్పుడూ క్రమబద్ధీకరించిన క్రమంలో (Sorted Order) ఉంచడానికి std::map మరియు std::set లను ఉపయోగిస్తాం.
- అంతర్గతంగా ఇవి Red-Black Tree (Self-balancing BST) ద్వారా నిర్మించబడ్డాయి.
- శోధన (Search), చేరిక (Insert), తొలగింపు (Delete) అన్నీ ఖచ్చితంగా
O(log N)టైమ్ కాంప్లెక్సిటీని గ్యారెంటీ చేస్తాయి. - కీలు ఎల్లప్పుడూ యునిక్ (Unique) గా ఉంటాయి.
#include <iostream>
#include <map>
#include <string>
int main() {
// std::map కీలను స్వయంచాలకంగా ఆల్ఫాబెటికల్ ఆర్డర్లో సార్ట్ చేస్తుంది!
std::map<std::string, double> currencyRates;
currencyRates["USD"] = 84.15;
currencyRates["EUR"] = 91.20;
currencyRates["GBP"] = 108.50;
currencyRates["AED"] = 22.90;
std::cout << "===== కరెన్సీ రేట్లు (ఆటోమేటిక్ Sorted Order) =====\n";
for (const auto& [currency, rate] : currencyRates) {
std::cout << " " << currency << " = ₹ " << rate << "\n";
}
// find() ద్వారా సురక్షిత సెర్చింగ్
auto it = currencyRates.find("EUR");
if (it != currencyRates.end()) {
std::cout << "\nEUR రేటు లభించింది: ₹ " << it->second << "\n";
}
return 0;
}
6 అనార్డర్డ్ కంటైనర్లు: std::unordered_map (Hash Tables: O(1))
మీకు డేటా సార్ట్ అవ్వాల్సిన పనిలేదు, కేవలం మెరుపు వేగంతో శోధించడం మాత్రమే ముఖ్యమైతే std::unordered_map ను ఎంచుకోవాలి.
- అంతర్గతంగా ఇది ఒక హ్యాష్ టేబుల్ (Hash Table).
- హ్యాష్ కొలీషన్లు లేనంత వరకు సగటు సెర్చ్ సమయం కేవలం
O(1)(Instant Lookup)!
| అంశం | std::map |
std::unordered_map |
|---|---|---|
| అంతర్గత నిర్మాణం | Red-Black Tree (Balanced BST) | Hash Table (Buckets + Hash function) |
| టైమ్ కాంప్లెక్సిటీ | O(log N) (స్థిరమైన గ్యారెంటీ) |
O(1) Average (Worst case O(N)) |
| ఎలిమెంట్స్ క్రమం | ఎల్లప్పుడూ సార్ట్ అయి ఉంటుంది | ఎటువంటి క్రమం ఉండదు (Random/Unordered) |
7 ఇటరేటర్ల ప్రపంచం & Iterator Invalidation ప్రమాదం
కంటైనర్లలోని అంశాలను మొదటి నుండి చివరి వరకు దర్శించడానికి (Traverse) మనం ఇటరేటర్లను (Iterators) ఉపయోగిస్తాం.
ఒక వెక్టార్పై ఇటరేటర్ ద్వారా లూప్ రన్ అవుతున్న సమయంలో, మీరు లూప్ లోపల
vec.push_back() లేదా vec.erase() చేస్తే, వెక్టార్ మెమరీ రీ-అలొకేట్ అయ్యి మీ పాత ఇటరేటర్లు అన్నీ చెల్లనివిగా (Invalidated) మారిపోతాయి! ఆ తర్వాత దాన్ని వాడితే సెగ్మెంటేషన్ ఫాల్ట్ క్రాష్ వస్తుంది.పరిష్కారం: లూప్లో ఎలిమెంట్లను తొలగించడానికి
it = vec.erase(it); రిటర్న్ విలువను వాడాలి లేదా C++20 std::erase_if వాడాలి!
8 మోడరన్ C++ Range-based for లూప్ & C++20 Ranges & Views
Modern C++ లో ఇటరేటర్ల సింటాక్స్ రాయాల్సిన పని లేకుండా Range-based for loop తో అత్యంత సులభంగా కోడ్ రాయవచ్చు:
for (const auto& item : container) { ... }
Modern C++20 Ranges పైప్లైన్ విప్లవం:
C++20 లో Linux టెర్మినల్ పైపుల వలె (|) డేటాను కాపీ చేయకుండా వ్యూస్ (Views) ద్వారా ఫిల్టర్ మరియు ట్రాన్స్ఫార్మ్ చేయవచ్చు:
auto result = numbers | std::views::filter([](int n){ return n % 2 == 0; })
| std::views::transform([](int n){ return n * n; });
9 కోర్ STL అల్గారిథమ్స్: సార్టింగ్ & బైనరీ సెర్చ్ ()
STL లో అత్యంత వేగవంతమైన హైబ్రిడ్ సార్టింగ్ అల్గారిథమ్ std::sort (ఇది QuickSort, HeapSort, మరియు InsertionSort మూడింటి కలయికతో పనిచేస్తుంది - O(N log N) గ్యారెంటీ!).
సార్ట్ చేయబడిన డేటాపై std::binary_search (O(log N)) లేదా std::lower_bound / std::upper_bound ద్వారా లాగరిథమిక్ వేగంతో సెర్చ్ చేయవచ్చు.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> scores = {85, 42, 99, 12, 73, 56, 91};
// 1. std::sort తో ఆరోహణ క్రమం
std::sort(scores.begin(), scores.end());
std::cout << "సార్ట్ చేసిన మార్కులు: ";
for (int s : scores) std::cout << s << " ";
std::cout << "\n";
// 2. Binary Search (ఖచ్చితంగా డేటా సార్ట్ అయి ఉండాలి!)
bool found = std::binary_search(scores.begin(), scores.end(), 73);
std::cout << "73 మార్కులు లిస్టులో ఉన్నాయా? " << (found ? "అవును (Found)" : "లేవు (Not Found)") << "\n";
return 0;
}
10 ట్రాన్స్ఫార్మింగ్ & న్యూమరిక్ అల్గారిథమ్స్ (std::transform & accumulate)
ఒక వెక్టార్లోని అన్ని ఎలిమెంట్లను మరొక రూపంలోకి మార్చడానికి std::transform ను, మరియు మొత్తం ఎలిమెంట్ల కూడిక కోసం std::accumulate (<numeric> హెడర్) ను ఉపయోగిస్తాం.
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
int main() {
std::vector<double> pricesUSD = {10.0, 25.5, 40.0, 100.0};
std::vector<double> pricesINR(pricesUSD.size());
const double exchangeRate = 84.0;
// std::transform తో USD ని నేరుగా INR గా మార్చడం
std::transform(pricesUSD.begin(), pricesUSD.end(), pricesINR.begin(),
[exchangeRate](double usd) { return usd * exchangeRate; });
// std::accumulate తో మొత్తం బిల్లు కూడటం
double totalBillINR = std::accumulate(pricesINR.begin(), pricesINR.end(), 0.0);
std::cout << "భారతీయ రూపాయల్లో మొత్తం బిల్లు: ₹ " << totalBillINR << "\n";
return 0;
}
11 STL పెర్ఫార్మెన్స్ బెస్ట్ ప్రాక్టీసెస్ (The Contiguous Rule)
-
డిఫాల్ట్గా ఎల్లప్పుడూ
std::vectorనే వాడండి: ఆధునిక CPU లలో L1/L2/L3 క్యాష్ లైన్లు కంటిగ్యువస్ మెమరీపై అత్యంత వేగంగా పనిచేస్తాయి.std::listకంటే వెక్టార్ కొన్ని వందల రెట్లు వేగంగా రన్ అవుతుంది. -
లార్జ్ కంటైనర్లకు
reserve()తప్పనిసరి. -
std::unordered_mapవాడేటప్పుడు హ్యాష్ ఫంక్షన్ను సరిగ్గా ఎంచుకోండి.
12 రియల్-వరల్డ్ ప్రాజెక్ట్: Enterprise E-Commerce Order Fulfilment & Search Analytics Engine
నిజ జీవితంలో Amazon లేదా Flipkart వంటి ఈ-కామర్స్ ప్లాట్ఫామ్లలో లక్షలాది ఉత్పత్తుల క్యాటలాగ్, కస్టమర్ ఆర్డర్ల ప్రాసెసింగ్, మరియు ప్రైమ్ డెలివరీ క్యూలు సమర్థవంతంగా నడవడానికి STL కంటైనర్ల కలయిక తప్పనిసరి.
ఈ సమగ్ర ప్రాజెక్ట్లో మనం unordered_map (ప్రొడక్ట్ క్యాటలాగ్), priority_queue (ఎక్స్ప్రెస్ ఆర్డర్ ఫుల్ఫిల్మెంట్), map (కేటగిరీ అనలిటిక్స్), మరియు STL అల్గారిథమ్స్తో కూడిన ఒక ఎంటర్ప్రైజ్ ఈ-కామర్స్ ఆర్డర్ ఇంజిన్ ను నిర్మిస్తున్నాం:
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <map>
#include <queue>
#include <algorithm>
#include <numeric>
#include <iomanip>
struct Product {
std::string sku;
std::string title;
double price;
std::string category;
};
struct Order {
int orderId;
std::string customerName;
std::vector<std::string> skus;
int deliveryUrgency; // 10: Prime Same-Day, 1: Standard
bool operator<(const Order& other) const {
return deliveryUrgency < other.deliveryUrgency; // Priority Queue కొరకు
}
};
int main() {
std::cout << "=======================================================================\n";
std::cout << "🛒 [ENTERPRISE E-COMMERCE ORDER FULFILMENT & ANALYTICS ENGINE]\n";
std::cout << "=======================================================================\n";
// 1. std::unordered_map: O(1) ప్రొడక్ట్ క్యాటలాగ్ ఇండెక్స్
std::unordered_map<std::string, Product> catalog = {
{"SKU_001", {"SKU_001", "MacBook Pro M3 Max", 249900.0, "Electronics"}},
{"SKU_002", {"SKU_002", "Sony WH-1000XM5 Headphones", 29990.0, "Audio"}},
{"SKU_003", {"SKU_003", "Ergonomic Mechanical Keyboard", 12499.0, "Accessories"}},
{"SKU_004", {"SKU_004", "Dell UltraSharp 4K Monitor", 58990.0, "Electronics"}}
};
// 2. std::priority_queue: ఎక్స్ప్రెస్ ప్రైమ్ ఆర్డర్ ఫుల్ఫిల్మెంట్ క్యూ
std::priority_queue<Order> fulfilmentQueue;
fulfilmentQueue.push({1001, "రాజేష్ వర్మ", {"SKU_002"}, 3});
fulfilmentQueue.push({1002, "ప్రియాంక రెడ్డి (PRIME VIP)", {"SKU_001", "SKU_004"}, 10});
fulfilmentQueue.push({1003, "సందీప్ కుమార్", {"SKU_003"}, 5});
std::cout << "\n[వేర్హౌస్ డిస్పాచ్ ఆర్డర్ ప్రాసెసింగ్ (Priority Queue ద్వారా)]:\n";
double totalRevenue = 0.0;
while (!fulfilmentQueue.empty()) {
Order currentOrder = fulfilmentQueue.top();
fulfilmentQueue.pop();
std::cout << " 📦 ఆర్డర్ #" << currentOrder.orderId << " కస్టమర్: " << currentOrder.customerName
<< " [Urgency Level: " << currentOrder.deliveryUrgency << "]\n";
double orderTotal = 0.0;
for (const auto& sku : currentOrder.skus) {
if (catalog.find(sku) != catalog.end()) {
const auto& prod = catalog[sku];
std::cout << " • ఐటెమ్: " << prod.title << " | ₹ " << prod.price << "\n";
orderTotal += prod.price;
}
}
std::cout << " -> ఆర్డర్ సబ్టోటల్: ₹ " << orderTotal << "\n\n";
totalRevenue += orderTotal;
}
std::cout << "=======================================================================\n";
std::cout << "💰 మొత్తం ప్రాసెస్ చేయబడిన టర్నోవర్: ₹ " << std::fixed << std::setprecision(2) << totalRevenue << "\n";
std::cout << "=======================================================================\n";
return 0;
}
13 సారాంశం & ఇంటరాక్టివ్ క్విజ్ (Summary & Self-Check Quizzes)
📌 ఈ అధ్యాయంలో నేర్చుకున్న ప్రధాన అంశాలు:
- STL Triad: Containers (స్టోరేజ్), Iterators (నావిగేషన్), Algorithms (ప్రాసెసింగ్) ల స్వతంత్ర డీకప్లింగ్ ఆర్కిటెక్చర్.
- std::vector: అత్యంత వేగవంతమైన కంటిగ్యువస్ కంటైనర్.
reserve()ద్వారా రీ-అలొకేషన్లను నివారించాలి. - std::deque & std::list: రెండు వైపులా
O(1)కొరకు డెక్; నోడ్-బేస్డ్ లింక్డ్ లిస్ట్ కొరకు లిస్ట్. - std::priority_queue: Max-Heap ఆధారంగా అత్యధిక ప్రాధాన్యత కలిగిన ఎలిమెంట్లను రన్టైమ్లో ముందుంచడం.
- std::map vs unordered_map: ఆర్డర్డ్ సార్టెడ్ ట్రీస్ కొరకు మ్యాప్ (
O(log N)); ఇన్స్టంట్ హ్యాష్ టేబుల్స్ కొరకు అనార్డర్డ్ మ్యాప్ (O(1)). - Iterator Invalidation: లూప్లలో కంటైనర్ను మార్చేటప్పుడు ఇటరేటర్లు చెల్లనివిగా మారే ప్రమాదాన్ని గుర్తించి నివారించడం.
- std::sort & transform:
O(N log N)IntroSort మరియు ఫంక్షనల్ డేటా ట్రాన్స్ఫార్మేషన్.
🧠 మీ అవగాహనను పరీక్షించుకోండి (5 Interactive Quizzes):
ప్రశ్న 1: std::vector లో size() మరియు capacity() మధ్య తేడా ఏమిటి?
size() అనేది ప్రస్తుత ఎలిమెంట్ల సంఖ్య; capacity() అనేది కొత్తగా మెమరీ రీ-అలొకేట్ చేయకుండా నిల్వ చేయగల గరిష్ట సామర్థ్యం!వివరణ: సైజ్ కెపాసిటీకి సమానమైనప్పుడు, కొత్త ఎలిమెంట్ వస్తే వెక్టార్ ఆటోమేటిక్గా తన కెపాసిటీని రెట్టింపు చేసుకుంటుంది.
ప్రశ్న 2: std::map మరియు std::unordered_map లలో శోధన (Lookup) వేగాల మధ్య వ్యత్యాసం ఏమిటి?
std::map లో O(log N), std::unordered_map లో సగటున O(1)!వివరణ:
std::map రెడ్-బ్లాక్ బ్యాలెన్స్డ్ ట్రీపై ఆధారపడి కీలను సార్ట్ చేస్తుంది. std::unordered_map హ్యాష్ టేబుల్పై ఆధారపడి ఆర్డర్ లేకుండా తక్షణ లుకప్ ఇస్తుంది.
ప్రశ్న 3: Iterator Invalidation అంటే ఏమిటి? ఇది ఎప్పుడు సంభవిస్తుంది?
వివరణ: ఒక వెక్టార్లో లూప్ జరుగుతున్నప్పుడు
push_back() చేయడం వల్ల మెమరీ వేరే చోటికి రీ-అలొకేట్ అయితే, పాత ఇటరేటర్ పాత చెల్లని మెమరీని చూపిస్తూ ప్రోగ్రామ్ క్రాష్ అవుతుంది.
ప్రశ్న 4: std::priority_queue లోపలి అంశాలు ఏ డేటా స్ట్రక్చర్ సూత్రంపై ప్రాసెస్ చేయబడతాయి?
వివరణ: ఏ క్రమంలో ఎలిమెంట్లను ఇన్సర్ట్ చేసినా, అత్యధిక ప్రాధాన్యత లేదా గరిష్ట విలువ కలిగిన ఎలిమెంట్ ఎల్లప్పుడూ
top() స్థానంలో ఉంచబడుతుంది.
ప్రశ్న 5: ఆధునిక CPU లలో std::list కంటే std::vector ఎందుకు విపరీతమైన వేగంతో నడుస్తుంది?
వివరణ: వెక్టార్ ఎలిమెంట్స్ RAM లో ఒకదాని పక్కన ఒకటి వరుసగా ఉంటాయి, కాబట్టి CPU ఒకే ఫెచ్తో మొత్తం క్యాష్లైన్ను తెచ్చుకుంటుంది. లింక్డ్ లిస్ట్ నోడ్స్ మెమరీలో చెల్లాచెదురుగా ఉండి విపరీతమైన క్యాష్ మిస్లకు కారణమవుతాయి.
ఈ ప్రాజెక్ట్ను లైవ్గా మన కంపైలర్లో రన్ చేయండి!
ఎటువంటి లోకల్ సెటప్ లేకుండా, బ్రౌజర్లోనే నేరుగా Modern C++ (GCC 13 / C++20) కంపైలర్లో ఈ కోడ్ను ఎగ్జిక్యూట్ చేసి రన్టైమ్ అవుట్పుట్ను తనిఖీ చేయండి.