Oct 20, 2020
Every other stuff -too tiny to make a new page-
Edit me
C++
Vector
1. useful functions
<algorithm>
- std::sort(v.begin(), v.end())
- std::unique(v.begin(), v.end())
- it moves duplicated elements on the back, and returns the number of the first duplicated elements.
- ! The vector has to be sorted.
- For example, { 0, 1, 1, 2, 2, 2, 3} => {0, 1, 2, 3, 1, 2, 2, 3} and returns 5. Therefore, you could use it as such:
std::sort(v.begin(), v.end());
v.resize(std::unique(v.begin(), v.end()) - v.begin());
-
v1 == v2 is true when v1 and v2 has the same elements in the same orders.
- &v1 == &v2 or *v1 == *v2 won’t be true tho.
Thoughts about data type Char
- So, as everyone knows, size of char is 8 bits = 1 byte. However, if you look at an ascii table, it only has 0 to 127, so total 128, which is only 2^7. I honestly don’t know why it uses 1 byte, maybe it’s just easy to remember that way. (Please make a comment if you know the history.) Anyways, this means -128 to -1 doesn’t mean anything while you are coding (maybe it has differnt meaning in it but idk atm). When you wanna encode your string, you could use it like this:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<char> v;
string test = "this is a test";
string ans;
for(const char& el : test){
ans += el*-1;
}
cout << ans <<'\n';
for(char& el : ans){
el *= -1;
}
cout << ans <<'\n';
return 0;
}
output is,
��������������
this is a test
Passing parameters
- & - pass by references
- It doesn’t make a copy of the value, but give you the real value. Thereby, if you change this, the original data(which is the same) will be changed.
void foo(int& value) {
value = 6;
}
int main() {
int value = 5;
// 6
cout << "value = " << value << '\n';
foo(value);
// 5
cout << "value = " << value << '\n';
return 0;
}
- const & - pass by references
- by doing so, you can implicitly show that it’s not changeable, and also you can reduce time of making a copy.
- * - pass by address
- literally.
void foo(int* ptr) {
*ptr = 6;
}
int main() {
int value = 5;
// 5
std::cout << "value = " << value << '\n';
foo(&value);
// 6
std::cout << "value = " << value << '\n';
return 0;
}
Declaration of functions in parameter
[](int a, int b){
content;
}
For example:
sort(arr.begin(), arr.end(), [](const int& a, const int& b){
return b < a;
});
Using outside values in Lambda expression
[outside_value_name](int a, int b){
content;
}
For example:
string order = 'qwertyuiopalskdjfhgzmxncbv';
// & to get it by reference
sort(arr.begin(), arr.end(), [&order](const int& a, const int& b){
return order.find(b) < order.find(a);
});
Use custom comparator with lambda expression on Priority Queue
// first, define lambda expression
auto comp = [](const pair<int,int> a, const pair<int,int> b){
if(a.first != b.first) return (a.first < b.first);
else return (a.second < b.second);
};
// use decltype and on constructor you have to put the lambda expression
priority_queue< pair<int,int>, vector<pair<int,int>>, decltype(comp)> pq(comp);
Recursion vs Tail recursion
- Tail Recursion is to prevent SOF(stack overflow), it uses the same stack memory by not having calculations in the function.