Hi everyone ↵
This is Lecture 1 of the series. We’ll start with **structs**, how to use them, constructors, operator overloading, and finally pairs.↵
↵
---↵
↵
## 1. Motivation (Why Struct?)↵
↵
We all know the basic data types:↵
↵
```cpp↵
int x;↵
string y;↵
```↵
↵
But let’s say we have a **company with 100 persons**.↵
Each person has:↵
↵
* `name` (string)↵
* `age` (int)↵
* `salary` (float)↵
↵
Naive approach:↵
↵
```cpp↵
string name[100];↵
int age[100];↵
float salary[100];↵
↵
cin >> name[0] >> age[0] >> salary[0];↵
```↵
↵
Problem: arrays are stored in **different places in memory** → not grouped.↵
↵
Solution → **Struct**:↵
↵
```cpp↵
struct Person {↵
string name;↵
int age;↵
float salary;↵
};↵
```↵
↵
---↵
↵
## 2. Using Struct↵
↵
```cpp↵
int main() {↵
Person x;↵
x.name = "Nourhan";↵
x.age = 21;↵
x.salary = 3000;↵
↵
cout << x.name << " " << x.age << " " << x.salary << endl;↵
}↵
```↵
↵
Array of Persons:↵
↵
```cpp↵
Person p[5];↵
for (int i = 0; i < 5; i++) {↵
cin >> p[i].name >> p[i].age >> p[i].salary;↵
}↵
```↵
↵
* Just like `int arr[5];`↵
* `p[i]` = person i↵
* `p[i].name` = person i’s name↵
↵
---↵
↵
## 3. Declaration vs Initialization↵
↵
```cpp↵
int x; // declaration↵
int y = 7; // initialization↵
```↵
↵
In structs we use **constructor** for initialization:↵
↵
```cpp↵
struct Person {↵
string name;↵
int age;↵
float salary;↵
↵
Person(string a, int b, float c) {↵
name = a;↵
age = b;↵
salary = c;↵
}↵
↵
Person() {} // empty constructor↵
};↵
```↵
↵
Usage:↵
↵
```cpp↵
int main() {↵
Person p("Nourhan", 21, 4000);↵
cout << p.name << " " << p.age << " " << p.salary;↵
}↵
```↵
↵
---↵
↵
## 4. Functions Inside vs Outside Struct↵
↵
Inside:↵
↵
```cpp↵
struct Person {↵
string name;↵
int age;↵
float salary;↵
↵
void read() {↵
cin >> name >> age >> salary;↵
}↵
};↵
```↵
↵
Outside:↵
↵
```cpp↵
void read(Person &x) {↵
cin >> x.name >> x.age >> x.salary;↵
}↵
```↵
↵
Usage:↵
↵
```cpp↵
for (int i = 0; i < n; i++) {↵
p[i].read(); // inside↵
// read(p[i]); // outside↵
}↵
```↵
↵
---↵
↵
## 5. Operator Overloading↵
↵
Problem: comparing two persons → which attribute?↵
↵
```cpp↵
struct Person {↵
string name;↵
int age;↵
float salary;↵
↵
bool operator<(const Person &tmp) const {↵
return salary < tmp.salary; // compare by salary↵
}↵
};↵
```↵
↵
Now we can:↵
↵
```cpp↵
sort(p, p + n); // uses operator<↵
```↵
↵
For descending order:↵
↵
```cpp↵
return salary > tmp.salary;↵
```↵
↵
---↵
↵
## 6. Compare Function (Outside Struct)↵
↵
```cpp↵
bool compare(Person a, Person b) {↵
return a.salary < b.salary;↵
}↵
↵
sort(p, p + n, compare);↵
```↵
↵
---↵
↵
## 7. Pair↵
↵
Like a mini-struct with just 2 elements.↵
↵
```cpp↵
pair<int,int> p;↵
cin >> p.first >> p.second;↵
```↵
↵
Comparison: first → then second.↵
↵
```cpp↵
pair<int,int> p1 = {1,2};↵
pair<int,int> p2 = {1,5};↵
```↵
↵
Custom compare:↵
↵
```cpp↵
bool comp(pair<int,int> &a, pair<int,int> &b) {↵
if (a.first == b.first) return a.second < b.second;↵
return a.first < b.first;↵
}↵
```↵
Stls problems↵
D — LR insertion↵
D — String Formation↵
B — String Rotation↵
D — Cylinder↵
D — Pair of Balls↵
Problem — 1511C — Codeforces↵
Problem — 1374C — Codeforces↵
Problem — 26B — Codeforces↵
Problem — 1452C — Codeforces↵
Problem — 1579E1 — Codeforces↵
Problem — 381A — Codeforces↵
Problem — 1169B — Codeforces↵
Problem — 1029C — Codeforces↵
Problem — 706B — Codeforces↵
Problem — 600B — Codeforces↵
↵
---↵
↵
## Summary↵
↵
* Struct groups multiple variables in one type↵
* Can use arrays of structs↵
* Declaration vs initialization (constructors)↵
* Functions inside/outside struct↵
* Operator overloading (`<`)↵
* Compare functions↵
* Pair = built-in struct of 2 values↵
↵
This is Lecture 1 of the series. We’ll start with **structs**, how to use them, constructors, operator overloading, and finally pairs.↵
↵
---↵
↵
## 1. Motivation (Why Struct?)↵
↵
We all know the basic data types:↵
↵
```cpp↵
int x;↵
string y;↵
```↵
↵
But let’s say we have a **company with 100 persons**.↵
Each person has:↵
↵
* `name` (string)↵
* `age` (int)↵
* `salary` (float)↵
↵
Naive approach:↵
↵
```cpp↵
string name[100];↵
int age[100];↵
float salary[100];↵
↵
cin >> name[0] >> age[0] >> salary[0];↵
```↵
↵
Problem: arrays are stored in **different places in memory** → not grouped.↵
↵
Solution → **Struct**:↵
↵
```cpp↵
struct Person {↵
string name;↵
int age;↵
float salary;↵
};↵
```↵
↵
---↵
↵
## 2. Using Struct↵
↵
```cpp↵
int main() {↵
Person x;↵
x.name = "Nourhan";↵
x.age = 21;↵
x.salary = 3000;↵
↵
cout << x.name << " " << x.age << " " << x.salary << endl;↵
}↵
```↵
↵
Array of Persons:↵
↵
```cpp↵
Person p[5];↵
for (int i = 0; i < 5; i++) {↵
cin >> p[i].name >> p[i].age >> p[i].salary;↵
}↵
```↵
↵
* Just like `int arr[5];`↵
* `p[i]` = person i↵
* `p[i].name` = person i’s name↵
↵
---↵
↵
## 3. Declaration vs Initialization↵
↵
```cpp↵
int x; // declaration↵
int y = 7; // initialization↵
```↵
↵
In structs we use **constructor** for initialization:↵
↵
```cpp↵
struct Person {↵
string name;↵
int age;↵
float salary;↵
↵
Person(string a, int b, float c) {↵
name = a;↵
age = b;↵
salary = c;↵
}↵
↵
Person() {} // empty constructor↵
};↵
```↵
↵
Usage:↵
↵
```cpp↵
int main() {↵
Person p("Nourhan", 21, 4000);↵
cout << p.name << " " << p.age << " " << p.salary;↵
}↵
```↵
↵
---↵
↵
## 4. Functions Inside vs Outside Struct↵
↵
Inside:↵
↵
```cpp↵
struct Person {↵
string name;↵
int age;↵
float salary;↵
↵
void read() {↵
cin >> name >> age >> salary;↵
}↵
};↵
```↵
↵
Outside:↵
↵
```cpp↵
void read(Person &x) {↵
cin >> x.name >> x.age >> x.salary;↵
}↵
```↵
↵
Usage:↵
↵
```cpp↵
for (int i = 0; i < n; i++) {↵
p[i].read(); // inside↵
// read(p[i]); // outside↵
}↵
```↵
↵
---↵
↵
## 5. Operator Overloading↵
↵
Problem: comparing two persons → which attribute?↵
↵
```cpp↵
struct Person {↵
string name;↵
int age;↵
float salary;↵
↵
bool operator<(const Person &tmp) const {↵
return salary < tmp.salary; // compare by salary↵
}↵
};↵
```↵
↵
Now we can:↵
↵
```cpp↵
sort(p, p + n); // uses operator<↵
```↵
↵
For descending order:↵
↵
```cpp↵
return salary > tmp.salary;↵
```↵
↵
---↵
↵
## 6. Compare Function (Outside Struct)↵
↵
```cpp↵
bool compare(Person a, Person b) {↵
return a.salary < b.salary;↵
}↵
↵
sort(p, p + n, compare);↵
```↵
↵
---↵
↵
## 7. Pair↵
↵
Like a mini-struct with just 2 elements.↵
↵
```cpp↵
pair<int,int> p;↵
cin >> p.first >> p.second;↵
```↵
↵
Comparison: first → then second.↵
↵
```cpp↵
pair<int,int> p1 = {1,2};↵
pair<int,int> p2 = {1,5};↵
```↵
↵
Custom compare:↵
↵
```cpp↵
bool comp(pair<int,int> &a, pair<int,int> &b) {↵
if (a.first == b.first) return a.second < b.second;↵
return a.first < b.first;↵
}↵
```↵
D — LR insertion↵
D — String Formation↵
B — String Rotation↵
D — Cylinder↵
D — Pair of Balls↵
Problem — 1511C — Codeforces↵
Problem — 1374C — Codeforces↵
Problem — 26B — Codeforces↵
Problem — 1452C — Codeforces↵
Problem — 1579E1 — Codeforces↵
Problem — 381A — Codeforces↵
Problem — 1169B — Codeforces↵
Problem — 1029C — Codeforces↵
Problem — 706B — Codeforces↵
Problem — 600B — Codeforces↵
↵
↵
## Summary↵
↵
* Struct groups multiple variables in one type↵
* Can use arrays of structs↵
* Declaration vs initialization (constructors)↵
* Functions inside/outside struct↵
* Operator overloading (`<`)↵
* Compare functions↵
* Pair = built-in struct of 2 values↵
↵



