|  | \- 1. Маленькие хитрости |
| | Вектор - это динамический массив (размеры могут изменяться во время выполнения) |
| |
 |  | \- контроль корректности при исполнении программы |
| assert(z\[i\] \!= LLONG_MAX); |
| |
| \- измерение времени выполнения и производительности процесора |
| cerr << fixed << setprecision(0) |
| << "TIME = " << clock() / (ld)CLOCKS_PER_SEC * 1000 << "\n"; |
| |
| \- для выхода из множества циклов внутри процедуры |
| return 0 |
| | Вектор полезен для параллельной сортировки нескольких массивов |
| |
 |  | \- 1LL - константа 1 типа long long |
| ans+=1LL*(выражение типа int), когда сумма превысит int |
| | Например, сортировка с номерами |
| (вектор неограниченной длины, пары добавляем в конец вектора) |
| {code:title=part.cpp|borderStyle=solid} |
| vector<pair<int, int> > v; |
| int n,i; |
| cin >> n; |
| int h[n]; |
| for(i = 0; i < n; i++) |
| { |
| cin >> h[i] ; |
| v.push_back(make_pair(h[i],i)); |
| } |
| sort(v.begin(), v.end()); |
| {code} |
| или сортировка пар |
| вектор фиксированной после ввода длины, пары добавляем по номеру |
| {code:title=part.cpp|borderStyle=solid} |
| int N, D; |
| cin >> N >> D; |
| |
 |  | \- да и нет по русски |
| {code:title=p1.cpp\|borderStyle=solid} #include <bits/stdc++.h> |
| using namespace std; |
| |
| int main() |
| { |
| int n,m,a\[50\],i; |
| char d,dd,u,uu,uuu; |
| d=164; dd=160; u=173; uu=165; uuu=226; |
| cin >> m >> n; |
| for(i=0;i<n;i++) cin >> a\[i\]; i=0; |
| while(i<n && a\[i\]\!=m) i++; |
| if(i==n) cout << u << uu << uuu; |
| else cout << d << dd; |
| }{code} |
| |
| | vector<pair<int, int> > A(N); |
| for(int i = 0; i < N; i++) |
| cin >> A[i].first >> A[i].second; |
| |
 |  | sort(A.begin(), A.end()); |
| {code} |
| Массив пар сортируется по возрастанию первого числа |
| а в случае равенства первого - по возрастанию второго |
| В случае, когда гарантируется, что все первые различны |
| второй массив просто параллельно передвигается, |
| фактически никогда не участвуя в сравнениях |
| |
 |  | 0. Для передачи значения обратно из функции в вызывающую программу |
| пишем знак & (передать адрес), например |
| bool Good(int &x) {...} |
| | В вектор можно запихнуть и четвёрки чисел, |
| а потом отсортировать параллельно 4 массива: |
| {code:title=part.cpp|borderStyle=solid} |
| vector<pair< pair<int,int> , pair<int,int> > > v; |
| |
 |  | Пример |
| {code:title=p2.cpp\|borderStyle=solid} #include <bits/stdc++.h> |
| using namespace std; |
| |
| void Split(int x, int &x1, int &x2, int &x3) |
| { |
| x1=x%10; |
| x3=x/100; |
| x2=(x/10) % 10; |
| } |
| |
| int main() |
| { |
| int i,i1,i2,i3, |
| j,j1,j2,j3, |
| n,a2,a3; |
| cin >> n; |
| ... |
| Split(i,i1,i2,i3); |
| Split(j,j1,j2,j3); |
| if (((i1+i2+i3)==(j1+j2+j3)) && (abs(i-j)>a3)) |
| a3=abs(i-j); |
| |
| }{code} |
| |
 |  | 1. Порядок вычисления логических выражений |
| Для && слева направо |
| && гарантирует что второй операнд не вычисляется, если первый - ложь. |
| | int N,i,x1,y1,x2,y2; |
| |
 |  | {quote} while ( (k<=es) && (s\[k\]\!=t) ) k++;{quote} |
| | cin >> N ; |
| for (i=0; i<N; i++) |
| { |
| cin >> x1 >> y1 >> x2 >> y2 ; |
| v.push_back(make_pair(make_pair(x1,y1),make_pair(x2,y2))); |
| } |
| sort(v.begin(),v.end()); |
| |
 |  | к s\[k\] не происходит обращения, если k>es |
| | v.size() - размер вектора (количество элементов в векторе) |
| {code} |
| Для обращения |
| к первому элементу вектора используем суффикс .first |
| ко второму - .second |
| первый элемент первой пары вектора v\[i\] |
| v\[i\].first.first |
| |
 |  | 2. {quote}iostream::sync_with_stdio(false); |
| cin.tie(NULL);{quote} |
| \- для ускорения потокового ввода |
| |
| |
| 3. Объявление файлов |
| |
| (стандартный потоковый ввод-вывод) |
| |
| {quote} ifstream cin("round.in"); |
| ofstream cout("round.out");{quote} |
| |
| или так |
| |
| {quote} freopen("auto.in", "r", stdin); |
| freopen("auto.out", "w", stdout);{quote} |
| |
| или так - потоковый ввод-вывод |
| с файловыми переменными fin fout |
| |
| {quote} ifstream fin("perimeter.in"); |
| ofstream fout("perimeter.out"); |
| fin >> n; |
| fout << n;{quote} |
| |
| Работа с файлом, если он есть |
| и с клавиатурой в противном случае |
| |
| {quote} if (fopen("boarding.in", "r")) |
| { |
| freopen("boarding.in", "r", stdin); |
| freopen("boarding.out", "w", stdout); |
| }{quote} |
| |
| |
| Работа с файлом, на своей машине |
| и с клавиатурой/экраном на DL |
| {quote} |
| #ifndef CONTEST |
| ifstream cin("input.txt"); |
| ofstream cout("output.txt"); |
| #endif{quote} |
| |
| Работа до конца входного файла |
| |
| {quote} ifstream cin("input.txt"); |
| ofstream cout("output.txt"); |
| |
| cin >> a; |
| while (not cin.eof()) |
| { |
| ... |
| cin >> a; |
| }{quote} |
| |
| 4. Знаковые |
| 2 байта - int |
| 4 байта - long int |
| 8 байт \- long long |
| |
| беззнаковые \- unsigned (int, long int, long long) |
| |
| |
| 5. Константы |
| {quote} #define MaxN 1e5; |
| const int MaN = 1e5;{quote} |
| |
| 6. {quote}ans = (ans==INF) ? \-1 : ans; // если ans=INF занесnи туда \-1{quote} |
| условие true false |
| |
| |
| 7. Как вернуть значение в вызывающую программу ? |
| \- написать & перед именем переменной |
| то есть в подпрограмму передаётся не значение, а адрес |
| и потому в подпрограмме модифицируется сама переменная |
| из вызывающей программы |
| |
| {code:title=part.cpp\|borderStyle=solid} |
| bool Found(int &x, int &y) |
| { |
| for (int i=0; i<8; i++) |
| for (int j=0; j<8; j++) |
| if (not Marked\[i\]\[j\]) |
| { x=i; y=j; return true;}; |
| return false; |
| }{code} |
| |
| |
| 8. Работа в Codeblocks |
| |
| \- ДУБЛИРОВАНИЕ СТРОКИ |
| ctrl+D |
| \- СДВИГ ТЕКСТА ВПРАВО/ВЛЕВО |
| отмечаем несколько строк и можно сдвигать их |
| вправо - клавишей TAB |
| влево \- клавишами Shift + TAB |
| |
| 9. Массив инициализируется нулями при объявлении? |
| |
| Массивы в C+\+ по стандарту по умолчанию не обнуляются. |
| Но для обнуления есть отдельный краткий синтаксис: |
| http://stackoverflow.com/questions/1920430/c-array-initialization |
| |
| Поэтому можно писать по вкусу: |
| {quote}int a\[10\] = {0}; |
| int a\[10\] = {}; |
| int a\[10\] {0}; |
| int a\[10\] {};{quote} |
| |
| Тогда отдельный обнуляющий цикл не понадобится. |
| |
| |
| Некоторые компиляторы, такие как GCC, заполняют все элементы массива нулями при его создании. |
| https://code-live.ru/post/cpp-arrays/ |
| |
| А вот эта программа без ручного обнуления не проходит: |
| {code:title=p3.cpp\|borderStyle=solid} |
| \#include <bits/stdc++.h> |
| | цикл обработки вектора из двух пар (четвёрки чисел) |
| {code:title=part.cpp|borderStyle=solid} |
| for (int i=0; i<v.size(); i++) |
| { |
| int x1,y1,x2,y2; |
| x1=v[i].first.first; |
| y1=v[i].first.second; |
| x2=v[i].second.first; |
| y2=v[i].second.second; |
| if (x0>x1 && x0<x2 && y0>y1 && y0<y2) return true; |
| } |
| {code} |
| binary_search(v.begin(),v.end(),i) - двоичный поиск числа i в векторе v; |
| \\ |
| {code:title=primer.cpp|borderStyle=solid} |
| #include <bits/stdc++.h> |
| using namespace std; |
| |
 |  | int main() |
| | int main() |
| { |
 |  | freopen("input.txt", "r", stdin); |
| freopen("output.txt", "w", stdout); |
| | vector<int> a; // создали пустой вектор типа int |
| a.reserve(10); // зарезервировали память под 10 элементов типа int |
| |
 |  | int g\[15\],n,m,k,i,x,y,ans; |
| | vector<int> b(10); // создали пустой вектор типа int |
| // зарезервировали память под 10 элементов типа int |
| // прописали их нулями |
| for(unsigned int i=0; i<b.size(); i++) // обработка вектора по его размеру |
| cout << b[i] << ' '; |
| |
 |  | cin>> n >> m >> k; |
| | vector<int> c(b); // копирование вектора (c=b) |
| for(unsigned int i=0; i<c.size(); i++) // обработка вектора по его размеру |
| cout << c[i] << ' '; |
| |
 | | for (i=0; i<n; i++) g\[i\]=0; // без этого оператора не сдаётся |
| |
| for (i=0; i<n; i++) |
| { |
| cin >> x >> y; |
| g\[--x\]=1; g\[--y\]=1; |
| } |
| ans=0; |
| for (i=0; i<n; i++) |
| if (g\[i\]==0) ans++; |
| cout << ans; |
| }{code} |
| |
| | if (c == b) cout << "c=b" << endl; // проверка векторов на равенство |
| } |
| {code}\\ |
| \\ |
| \\ |