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

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

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


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

 \- 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
 \* 1LL - константа 1 типа long long&nbsp; &nbsp; &nbsp; &nbsp;ans+=1LL*(выражение типа int), когда сумма превысит int
 \* да и нет по русски &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;
 {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()&nbsp;{&nbsp; freopen("input.txt","r", stdin);&nbsp; freopen("output.txt","w", stdout); &nbsp;intg\[15\],n,m,k,i,x,y,ans; &nbsp; cin>> n >> m >> k; &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;}
  или сортировка пар
 вектор фиксированной после ввода длины, пары добавляем по номеру
  
 {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}\\
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: http://www.atlassian.com/software/confluence Build:#2.6.1 916) - Ошибка/новая особенность - Свяжитесь с Администраторами