Вектора в C++ (часть 4)

В вектор можно добавлять элементы с помощью указателей, для этого используется функция vector::data(). Вывод вектора так же можно осуществить при помощи указателя, пример:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  vector<int>vecInt(5);
  int i;
  int *pointer=vecInt.data();///создание указателя 
    for( i=0;i<5;++i)
  {
      pointer[i]=i;///равносильно vecInt[i]=I;
  }

  cout<<"First  output: ";
  for(i=0;i<5;++i)
  {
      cout<<pointer[i]<<ends;///равносильно vecInt[i];
  }
  cout<<endl;

  cout<<"Second output: ";
  for(i=0;i<5;++i)
  {
      cout<<*pointer<<ends;
      pointer++;
  }
  cout<<endl;

  cout<<"Third  output: ";
  for(i=0;i<5;++i)
  {
      cout<<vecInt[i]<<ends;///стандартный вариант вывода
  }
  return 0;
}

Работа программы:

CppStudio.com

First  output: 0 1 2 3 4
Second output: 0 1 2 3 4
Third  output: 0 1 2 3 4

В 7 строке мы объявили вектор vecInt размером на 5 элементов типа int. В 9 строке создаем указатель pointer, указывающий на нулевой элемент вектора. С 10-13 строки производим заполнение вектора при помощи указателя pointer. Вывод нашего вектора можно выполнить тремя различными способами. В строках с 16-19 выполняется первый вариант вывода. Этот вариант вывода равносилен выводу массива с использованием указателей, так, что нечего необычного и непонятного для Вас быть не должно.

Следующий вариант вывода описан в строках 23-27. Поскольку расположение элементов вектора в памяти производится последовательно один за другим, то в строке 25 указатель указывает на ячейку в памяти, где расположен i-тый элемент вектора (вывод которого мы и осуществляем) . В 26 строке используя постфиксную форму, мы увеличиваем значение указателя на единицу, указатель указывает на следующий элемент вектора. Третий вывод самый обычный, описан с 31-34 строку, с ним тоже вопросов быть не должно.

В вектора можно вставлять элемент, как в начало вектора, так и в конец, при помощи функций vector::emplace() и vector::emplace_back(), рассмотрим пример:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
   vector<int>vecInt;
   vector<int>::iterator it;

   for(int i=0;i<5;++i)///заполнение вектора значениями 0-4
   {
       vecInt.push_back(i);
   }

   ///итератор указывает на нулевой элемент вектора
   it=vecInt.begin();

   vecInt.emplace(it,10);///вставляем нулевым элементом число 10 в вектор

   it=vecInt.begin()+2;///итератор указывает на второй элемент вектора

   vecInt.emplace(it,10);///вставляем вторым элементом число 10 в вектор

   vecInt.emplace_back(10);///вставляем в конец вектора число 10

   cout<<"Vector contains: ";
   for( it=vecInt.begin();it<vecInt.end();++it)
   {
       cout<<*it<<ends;
   }
   return 0;
}

Работа программы:

CppStudio.com

Vector contains: 10 0 10 1 2 3 4 10

Работу программы в строках с 6-12, думаю, описывать не стоит. В 15 строке итератор it указывает на начало нашего вектора, а в 17 строке при помощи функции vector::emplace() и итератора it, мы помещаем число 10 в начало вектора, т. е. vector::emplace() принимает два аргумента, первый, это позиция куда будет помещен элемент (в нашем случае vecInt.begin() или нулевой элемент вектора), второе, сам элемент (в нашем случае число 10).

В 19 строке итератор указывает на второй элемент в векторе vecInt[2]. Назначение строки 21 равносильно строке 17. В 23 строке с помощью функции vector::emplace_back(), мы помещаем число 10 в конец вектора. Эта запись равносильна vecInt.push_back(10). В строках 26-29 производится вывод вектора на экран с помощью итератора it.

Вектора имеют функцию, которая позволяет определить пустой ли вектор, позволяет удалить определенный элемент, получить доступ к нулевому и последнему элементу, пример:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
   vector<int>vecIntFirst, vecIntSecond;
   for(int i=0;i<10;++i)///заполняем вектор vecIntSecond значениями 0-9
   {
       vecIntSecond.push_back(i);
   }

   cout<<"vecIntSecond contains: ";
   for(int i=0;i<vecIntSecond.size();++i)///выводим заполненный вектор vecIntSecond
   {
       cout<<vecIntSecond[i]<<ends;
   }

   vecIntFirst.empty()?cout<<"\nvecIntFirst is empty\n":cout<<"vecIntFirst is not empty\n";
   vecIntSecond.empty()?cout<<"vecIntSecond is empty\n":cout<<"vecIntSecond is not empty\n";

   ///нумерация векторов идет от нулевого элемента
   vecIntSecond.erase(vecIntSecond.begin()+1);///стираем 1 элемент вектора
   vecIntSecond.erase(vecIntSecond.begin()+2,vecIntSecond.begin()+6);///стираем 3-6 элементы вектора, 7 элемент не стирается

   cout<<"vecIntSecond contains: ";
   for(int i=0;i<vecIntSecond.size();++i)
   {
       cout<<vecIntSecond[i]<<ends;
   }
   cout<<endl;

   cout<<"first element in vector: "<<vecIntSecond.front()<<endl;///выводим самый первый элемент в векторе
   cout<<"last element in vector: "<<vecIntSecond.back()<<endl;///выводим самый последний элемент в векторе
   cout<<"first-last: "<<vecIntSecond.front()-vecIntSecond.back()<<endl;///вычитаем из первого элемент вектора последний элемент вектора
   return 0;
}

Работа программы :

CppStudio.com

vecIntSecond contains: 0 1 2 3 4 5 6 7 8 9
vecIntFirst is empty
vecIntSecond is not empty
vecIntSecond contains: 0 2 7 8 9
first element in vector: 0
last element in vector: 9
first-last: -9

Думаю до строки 19, объяснять работу программы не стоит.  В 19 и 20 строке мы знакомимся с новым оператором vector::empty() который возвращает значение  true если пустой вектор и false если полон. В строках 19 и 20 используется тернарный оператор ( ? : ), который равносилен конструкции if() else(). Строку 19 можно прочитать так: если vecIntFirst пуст, то выведи сообщение, что он пуст, иначе выведи сообщение, что он не пуст. 20 строка равносильна 19 строке. В строке 23 с использованием функции vector:erase(), мы стираем первый элемент вектора (не забывайте, что вектора как и массивы нумеруются с нулевого элемента).

Функции vector:erase() мы указываем, что бы она удаляла элемент в позиции vecIntSecond.begin() который у нас равен нулевому элементу, плюс один элемент. Иначе говоря 0+1=1 (удален первый элемент). В строке 24 я хотел показать, что можно удалять не только один элемент вектора, но так же и группу элементов. Тут функция vector:erase() принимает два аргумента: первый – элемент, с которого начнется удаление (он будет удален) и второй – элемент по который будет производиться удаление, последний элемент (не будет удален).

Функции vector:erase() можно задавать не только координаты начала вектора vecIntSecond.begin(), но так же и координаты конца вектора vecIntSecond.end(), тогда нумерация пойдет с конца. В строках 27-30 производится вывод на экран, а в строке 33 мы с помощью функции vector::front() обращаемся к нулевому элементу вектора и выводим ее на экран. В 34 строке соответственно к последнему элементу вектора и тоже выводим ее на экран. В 35 строке мы вычитаем из первого элемента, последний элемент и выводим разницу.

Автор: Marienko L.
Дата: 28.01.2014
Поделиться:

Комментарии

  1. Tom Eit

    Помогите не работает emplace в вижуал студио скачаного с оф сайта недавно

  2. Dinmukhammed Junisov

    Вы написали vector::emplace_back(), мы помещаем число 10 в конец вектора. Эта запись равносильнаvecInt.push_back(10).

    Но ведь vector::emplace_back() помещает в конец , а vecInt.push_back(10) в самую верх то есть в начало вектора, не так ли?

    • NaikoN

      Вот пример :

      #include <vector>
      #include <iostream>
      using namespace std;
      
      
      int main()
      {
      
          vector <int> myvec;
          for(int i = 0; i < 3; ++i)
          {
              myvec.push_back(i);
          }
          for(int i = 0; i < 3; ++i)
          {
              cout << myvec[i] << ends;
          }
          myvec.push_back(3);
          cout << endl;
          for(int i = 0; i < 4; ++i)
          {
              cout << myvec[i] << ends;
          }
          return 0;
      }
      Вывод:
      #include <vector>
      #include <iostream>
      using namespace std;
      
      
      int main()
      {
      
          vector <int> myvec;
          for(int i = 0; i < 3; ++i)
          {
              myvec.push_back(i);
          }
          for(int i = 0; i < 3; ++i)
          {
              cout << myvec[i] << ends;
          }
          myvec.push_back(3);
          cout << endl;
          for(int i = 0; i < 4; ++i)
          {
              cout << myvec[i] << ends;
          }
          return 0;
      }
      Вывод:
      012
      0123
      Правильно ли я тебя понял, что при использовании myvec.push_back(3); вывод должен был быть вида: 3012 ????
      
      
      
      • NaikoN

        Что-то выше не очень красиво вышло.

        Пример:

        #include <vector>
        #include <iostream>
        using namespace std;
        
        
        int main()
        {
        
            vector <int> myvec;
            for(int i = 0; i < 3; ++i)
            {
                myvec.push_back(i);
            }
            for(int i = 0; i < 3; ++i)
            {
                cout << myvec[i] << ends;
            }
            myvec.push_back(3);
            cout << endl;
            for(int i = 0; i < 4; ++i)
            {
                cout << myvec[i] << ends;
            }
            return 0;
        }

        Правильно ли я тебя понял, что при использовании 

        myvec.push_back(3);

        вывод должен был быть вида: 3012 ????

         

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.