|  | \- 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=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} |
| 0. Для передачи значения обратно из функции в вызывающую программу пишем знак & (передать адрес), например bool Good(int &x) |
| {...} |
| |
| Пример #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); } |
| | {quote} 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());{quote} |
| |
 |  | 1. Порядок вычисления логических выражений Для && слева направо && гарантирует что второй операнд не вычисляется, если первый - ложь. |
| while ( (k<=es) && (s[k]!=t) ) k++; |
| к s[k] не происходит обращения, если k>es |
| 2. iostream::sync_with_stdio(false); cin.tie(NULL); - для ускорения потокового ввода |
| 3. Объявление файлов |
| (стандартный потоковый ввод-вывод) |
| ifstream cin("round.in"); ofstream cout("round.out"); или так |
| freopen("auto.in", "r", stdin); freopen("auto.out", "w", stdout); |
| или так - потоковый ввод-вывод с файловыми переменными fin fout |
| ifstream fin("perimeter.in"); ofstream fout("perimeter.out"); fin >> n; fout << n; |
| Работа с файлом, если он есть и с клавиатурой в противном случае |
| if (fopen("boarding.in", "r")) |
| { freopen("boarding.in", "r", stdin); freopen("boarding.out", "w", stdout); } |
| |
| Работа с файлом, на своей машине и с клавиатурой/экраном на DL |
| #ifndef CONTEST ifstream cin("input.txt"); ofstream cout("output.txt"); #endif |
| Работа до конца входного файла |
| ifstream cin("input.txt"); ofstream cout("output.txt"); |
| cin >> a; while (not cin.eof()) |
| { ... cin >> a; } |
| |
 | | 4. Знаковые 2 байта - int 4 байта - long int 8 байт - long long |
| беззнаковые - unsigned (int, long int, long long) |
| 5. Константы #define MaxN 1e5; const int MaN = 1e5; |
| 6. ans = (ans==INF) ? -1 : ans; // если ans=INF занесnи туда -1 условие true false |
| 7. Как вернуть значение в вызывающую программу ? - написать & перед именем переменной то есть в подпрограмму передаётся не значение, а адрес и потому в подпрограмме модифицируется сама переменная из вызывающей программы |
| 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; } |
| 8. Работа в Codeblocks |
| - ДУБЛИРОВАНИЕ СТРОКИ ctrl+D - СДВИГ ТЕКСТА ВПРАВО/ВЛЕВО отмечаем несколько строк и можно сдвигать их вправо - клавишей TAB влево - клавишами Shift + TAB |
| 9. Массив инициализируется нулями при объявлении? |
| Массивы в C++ по стандарту по умолчанию не обнуляются.Но для обнуления есть отдельный краткий синтаксис:http://stackoverflow.com/questions/1920430/c-array-initialization |
| Поэтому можно писать по вкусу:int a[10] = |
| {0};int a\[10\] = {};int a\[10\] {0} |
| ;int a[10] {}; |
| Тогда отдельный обнуляющий цикл не понадобится. |
| Некоторые компиляторы, такие как GCC, заполняют все элементы массива нулями при его создании. https://code-live.ru/post/cpp-arrays/ |
| А вот эта программа без ручного обнуления не проходит: |
| p3.cpp\#include <bits/stdc++.h>using namespace std;intmain() { freopen("input.txt","r", stdin); freopen("output.txt","w", stdout); intg\[15\],n,m,k,i,x,y,ans; cin>> n >> m >> k; 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;} |
| | или сортировка пар |
| вектор фиксированной после ввода длины, пары добавляем по номеру |
| |
| {quote} int N, D; |
| cin >> N >> D; |
| |
| 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());{quote} |
| |
| Массив пар сортируется по возрастанию первого числа |
| а в случае равенства первого - по возрастанию второго |
| В случае, когда гарантируется, что все первые различны |
| второй массив просто параллельно передвигается, |
| фактически никогда не участвуя в сравнениях |
| |
| |
| В вектор можно запихнуть и четвёрки чисел, |
| а потом отсортировать параллельно 4 массива: |
| |
| {quote}vector<pair< pair<int,int> , pair<int,int> > > v;{quote} |
| |
| {quote} int N,i,x1,y1,x2,y2; |
| |
| 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());{quote} |
| |
| v.size() - размер вектора (количество элементов в векторе) |
| |
| Для обращения |
| к первому элементу вектора используем суффикс .first |
| ко второму - .second |
| первый элемент первой пары вектора v[i] |
| {quote} v[i].first.first {quote} |
| |
| цикл обработки вектора из двух пар (четвёрки чисел) |
| |
| {quote} 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; }{quote} |
| |
| |
| {quote}binary_search(v.begin(),v.end(),i) - двоичный поиск числа i в векторе v; {quote} |
| {code:title=primer.cpp|borderStyle=solid} |
| #include <bits/stdc++.h> |
| using namespace std; |
| |
| int main() |
| { |
| vector<int> a; // создали пустой вектор типа int |
| a.reserve(10); // зарезервировали память под 10 элементов типа int |
| |
| vector<int> b(10); // создали пустой вектор типа int |
| // зарезервировали память под 10 элементов типа int |
| // прописали их нулями |
| for(unsigned int i=0; i<b.size(); i++) // обработка вектора по его размеру |
| cout << b[i] << ' '; |
| |
| vector<int> c(b); // копирование вектора (c=b) |
| for(unsigned int i=0; i<c.size(); i++) // обработка вектора по его размеру |
| cout << c[i] << ' '; |
| |
| if (c == b) cout << "c=b" << endl; // проверка векторов на равенство |
| }{code}\\ |