Рабочий стол > DL Руководство пользователя > ... > Полезные факты о С++ и примеры задач > Вектор > Information > Сравнение страницы
Вектор Войти | Зарегистрироваться   Просмотр версии для печати текущей страницы.

Версия 1 Egor
на Oct 09, 2016 11:37.

 
в сравнении с
Текущий из Egor
за Oct 09, 2016 12:27.

 
Ключ
Эти линии были удалены. Это слово было удалено.
Эти линии были добавлены. Это слово было добавлено.

Просмотр истории страницы


Есть 16 изменений. Просмотреть первое изменение .

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