Вектор указателей в С++

Двумерный вектор в C++ Программирование и разработка

Вектор указателей — это вектор, который может содержать несколько указателей. Каждый указатель в векторе указателей указывает на адрес, хранящий значение. Мы можем использовать вектор указателей для управления значениями, которые не хранятся в непрерывной памяти.

Как создать вектор указателей в C++?

Подобно любому другому объявлению вектора, мы можем объявить вектор указателей. В C++ мы можем объявить векторные указатели, используя 3 метода:

  • Использование контейнера std::vector
  • Использование [ ] notations
  • Использование new keyword (динамическая память)

1. Использование контейнера std::vector

Использование векторов для создания векторных указателей — самый простой и эффективный метод, так как он обеспечивает дополнительную функциональность STL.

vector<int *> v1 ;              //vector with integer pointers
vector<float *> v2;             //vector with float pointers
vector<string *> v3;            //vector with string pointers

Вставьте элементы в вектор:

Мы можем вставлять элементы двумя способами:

  • во время инициализации
  • используя push_back()

Вставка во время инициализации: Хотя это вариант, который можно использовать, мы должны избегать такого типа вставки, поскольку векторы хранят адреса внутри себя.

Вставка с использованием push_back(): вставка элемента аналогична присвоению элементам вектора определенных значений. Мы можем выполнить эту задачу в определенные шаги.

  • Создайте переменную и вставьте в нее значение.
  • Вставьте адрес переменной внутрь вектора.

Удаление элементов

Удаление элемента не так просто, как pop_back в случае с указателями. Это можно сделать, используя 2 шага:

  1. Освободить указатель (удалить адрес из переменной)
  2. Сотрите переменную.

С++

// C++ Program to create
// vector of pointer
#include<bits/stdc++.h>
 
using namespace std;
 
void insert_element(vector<int*>& v, int i)
{
    // declaration and input of values of elements
    int a;
    cin >> a;
 
    // allocating address to i element
    v[i] = new int(a);
}
 
void print_vector(vector<int*>& v)
{
    // printing elements of the vector
    for (int i = 0; i < v.size(); i++) {
        cout << *(v[i]) << " ";
    }
 
    cout << endl;
}
 
void delete_element(vector<int*>& v, int pos)
{
    // Out of limit positions
    if (pos <= 0 || pos > v.size())
        return;
 
    // converting position into index number
    pos = pos - 1;
 
    // free the space from pointer
    delete v[pos];
 
    // removing element from the vector
    v.erase(v.begin() + pos);
}
 
int main()
{
    cout << "Enter size of vector: ";
 
    // size of vector
    int n;
    cin >> n;
 
    // create a vector
    vector<int*> v(n, nullptr);
 
    cout << "Enter elements of vector: ";
    for (int i = 0; i < n; i++) {
 
        // inseting n elements inside v vector
        insert_element(v, i);
    }
 
    cout << "Before: ";
    // printing vector
    print_vector(v);
 
    cout << "Enter position to remove: ";
 
    int pos;
    cin >> pos;
 
    // delete element from pos position
    delete_element(v, pos);
 
    cout << "After: ";
    // printing vector
    print_vector(v);
 
    return 0;
}

Выход:

Enter size of vector: 5
Enter elements of vector: 5 4 3 2 1
Before: 5 4 3 2 1
Enter position to remove: 3
After: 5 4 2 1

2. Использование [ ] notations 

Квадратные скобки используются для объявления фиксированного размера. Это можно использовать для создания массива, содержащего несколько указателей. Это тип массива, который может хранить адрес, а не значение. Таким образом, можно назвать массив указателей, а адрес памяти находится в памяти стека, а не в памяти кучи.

Читайте также:  Структура данных 101: как создавать минимальную и максимальную heaps (кучу)

Синтаксис:

int *arr[size_of_arr];

Пример:

С++

// C++ Program to create
// pointer array
#include <iostream>
using namespace std;
 
void remove_element(int** arr, int* n)
{
    int pos = *n;
 
    // releasing the element
    arr[pos - 1] = NULL;
 
    // decreasing the size by one
    *n = (*n) - 1;
}
 
void print_elements(int** arr, int n)
{
    // printing elements
    for (int i = 0; i < n; i++) {
        cout << *(arr[i]) << " ";
    }
 
    cout << endl;
}
 
int main()
{
    cout << "Enter the size of array: ";
 
    // declaring size of array
    int n;
    cin >> n;
 
    // creating an pointer array
    int* arr[n];
    int input[n];
 
    cout << "Enter the elements of the array: ";
 
    // inserting elements in array
    for (int i = 0; i < n; i++) {
        cin >> input[i];
 
        arr[i] = &input[i];
    }
 
    cout << "Elements before: \n";
    print_elements(arr, n);
 
    // removing last element in array
    remove_element(arr, &n);
 
    cout << "Elements after removal: \n";
 
    print_elements(arr, n);
}

Выход:

Enter the size of array: 5
Enter the elements of the array: 5 4 3 2 1
Elements before:
5 4 3 2 1
Elements after:
5 4 3 2

3. Использование new keyword

Новое ключевое слово в C++ представляет динамическое выделение памяти, т. е. динамическую память. Код будет страдать от утечки памяти, если программист не освободит память перед выходом. Это может привести к серьезной проблеме в долго работающих приложениях или аппаратных средах с ограниченными ресурсами.

Синтаксис:

int **arr=new int*[size_of_array];

Пример:

С++

// c++ Program to create
// vector pointer
// using new keyword (dynamic array)
#include <iostream>
#include <vector>
using namespace std;
 
void print_vector(int** ptr, int n)
{
    cout << "Elements are: ";
 
    // printing the values of the array
    for (int i = 0; i < n; i++) {
        cout << **(ptr + i) << " ";
    }
 
    cout << endl;
}
 
void remove_element(int** ptr, int* n)
{
    int pos = *n - 1;
 
    // releasing the element from the array
    delete ptr[pos];
 
    // decreasing the size of array
    (*n)--;
}
 
int main()
{
 
    cout << "Enter size of array: ";
    // decalring size of array;
    int n;
    cin >> n;
 
    // declaring dynamic array
    int** ptr = new int*[n];
 
    cout << "Enter elements of array:";
 
    // inserting elements in array
    for (int i = 0; i < n; i++) {
 
        // declaring a variable to store in array
        int a;
        cin >> a;
 
        // Inserting the declared variable in the array
        *(ptr + i) = new int(a);
    }
 
    cout << "Array Before removing element\n";
    print_vector(ptr, n);
 
    // remove last element from array
    remove_element(ptr, &n);
 
    cout << "Array After removing element\n";
    print_vector(ptr, n);
 
    // removing all elements of array
    for (int i = 0; i < n; i++) {
        delete ptr[i];
    }
 
    // releasing array
    delete ptr;
}

Выход:

Enter size of array: 5
Enter elements of array: 5 4 3 2 1
Array Before removing element
Elements are: 5 4 3 2 1
Array After removing element
Elements are: 5 4 3 2

Оцените статью
bestprogrammer.ru
Добавить комментарий

Adblock
detector