Вектор указателей — это вектор, который может содержать несколько указателей. Каждый указатель в векторе указателей указывает на адрес, хранящий значение. Мы можем использовать вектор указателей для управления значениями, которые не хранятся в непрерывной памяти.
Как создать вектор указателей в 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 шага:
- Освободить указатель (удалить адрес из переменной)
- Сотрите переменную.
С++
// 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
Квадратные скобки используются для объявления фиксированного размера. Это можно использовать для создания массива, содержащего несколько указателей. Это тип массива, который может хранить адрес, а не значение. Таким образом, можно назвать массив указателей, а адрес памяти находится в памяти стека, а не в памяти кучи.
Синтаксис:
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