vector — Dynamic Array
std::vector (header <vector>) C++ ka sabse zyada use hone wala container hai — ek dynamically-resizable array. push_back() se end mein add karo, size() se current size pata karo, [i] ya .at(i) se access karo — bilkul array jaisa feel hota hai, lekin size fix karne ki tension nahi.
Internally vector C ke realloc() jaisi hi strategy use karta hai — jab capacity khatam ho jaati hai, ek bada naya block allocate karke purana data copy karta hai. Isliye push_back() usually O(1) hai (amortized), lekin kabhi-kabhi (resize hote waqt) O(n) ho sakta hai.
#include <vector>
using namespace std;
int main() {
vector<int> nums; // khaali vector, dynamically grow karega
nums.push_back(10);
nums.push_back(20);
nums.push_back(30);
cout << nums.size() << endl; // 3
cout << nums[1] << endl; // 20
for (int n : nums) { // range-based for se traverse
cout << n << " ";
}
return 0;
}- vector = dynamically-resizable array
- push_back(), size(), [i]/.at(i) — sabse common operations
- Amortized O(1) insertion at end
vector<vector<int>> ek dynamic 2D array banata hai — har "row" khud ek vector hai, apni independent size ke saath (jagged arrays possible hain, jaha har row alag length ki ho sakti hai — normal 2D arrays mein possible nahi tha).
vector<vector<int>> grid(3, vector<int>(4, 0)); // 3x4 grid, sab 0 se initialized
grid[1][2] = 99;
for (auto &row : grid) {
for (int val : row) {
cout << val << " ";
}
cout << endl;
}push_back()/pop_back() sirf end par kaam karte hain. Middle se element remove/insert karne ke liye erase()/insert() use hote hain, jo iterator leke kaam karte hain — O(n) operation hai (elements shift hone padte hain).
vector<int> nums = {10, 20, 30, 40};
nums.erase(nums.begin() + 1); // index 1 (20) remove — {10, 30, 40}
nums.insert(nums.begin() + 1, 99); // index 1 par 99 insert — {10, 99, 30, 40}
for (int n : nums) cout << n << " ";