Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
#1

Подскажите как переписать класс с использованием умных указателей, либо STL - C++

22.06.2014, 06:14. Просмотров 419. Ответов 5
Метки нет (Все метки)

К сожалению, знания об умных указателях и библиотеке STL прошли мимо меня...
Сейчас пытаюсь восполнить этот пробел, но уже третий день не могу понять как этим пользоваться.
Очень прошу помочь мне, показав, как описанный ниже класс перевести на умные указатели, или на векторы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class test
{
private:
int           Amount;
int            x;
float*        y;
double**    z;
 
public:
 
test(int fAmount)
{
Amount = fAmount;
x = Amount;
y = new float[Amount];
z = new double*[Amount];
for(int i = 0; i < Amount; i++)
z[i] = new double[Amount];
}
 
~test(void)
{
delete[] y;
for(int i=0;i<Amount;i++)
{delete[] z[i];}
delete[] z;
}
 
};
Я сначала думал не сдаваться и писать в старом стиле, но когда увидел то огромное количество двумерных массивов , с которым придется работать, а значит и прописывать руками их удаление в деструкторе, просто сник.
Теперь читаю про умные указатели и про STL. Плохо понимаю что происходит.
Вот вопросы:
1) Умный указатель сам удаляет объект, когда это необходимо? Поддерживаются ли двумерные массивы?
2) Какой из классов STL лучше всего подойдет для замены стандартных двумерных массивов? Я правильно понял, что это vector?
3) Можно ли явно указать умному указателю и классу vector когда они больше не нужны? (например, создать двумерный вектор vec, затем написать vec.destroy() и он сразу исчезнет).
Буду благодарен за любую помощь, так как почему-то мозг затупил и никак не хочет воспринимать инструментом прочитанное мной об этом всем...

Добавлено через 1 час 18 минут
Сейчас усердно пытаюсь сделать вместо двойных указателей двойной вектор.
У меня получилось реализовать это в функции (все оказалось довольно просто).
Но как мне засунуть двумерный вектор в переменную класса???

Вот, что я использую внутри функции:

C++
1
vector< vector<int> > Matrix    (   n, vector<int>(m)   );
А как это засунуть в класс?
C++
1
2
3
4
5
6
7
8
9
class vec
{
private:
//Двумерный вектор, размер которого будет определен позже
 
public:
vec();
~vec();
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2014, 06:14     Подскажите как переписать класс с использованием умных указателей, либо STL
Посмотрите здесь:

Правильное использование умных указателей, как членов класса - C++
Допустим у нас есть класс Node, объекты которого могут хранить вложенные Node, как правильнее объявлять конструктор? Так? class Node...

Переписать функцию с использованием указателей - C++
Подскажите пожалуйста как выполнить задание::wall: Перепишите функцию revers с использованием указателей #include &lt;iostream&gt; ...

Переписать код с использованием указателей на функцию - C++
Помогите вот эту программу переделать на указатели! Спасибо всем) #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;conio.h&gt; ...

Переписать приведенный код с использованием указателей - C++
Есть такой код с функциями. Надо его реализовать через указатели. 3 задания к лабе сделал, а вот ето незнаю как( #include &lt;stdio.h&gt; ...

Использование умных указателей - C++
В каких случаях вы используете умные указатели, а в каких обычные?

Приведение типов умных указателей - C++
Добрый день. Реализовал простенький умный указатель с подсчетом ссылок. template&lt;typename object_t&gt; class Ptr { public: ...

Использование указателей на контейнеры STL в заголовочных файлах - C++
Для использования указателей на I/O классы достаточно включить &lt;iosfwd&gt; который содержит опережающие объявления и таким образом появляется...

Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него - C++
Как правильно создать двумерный массив указателей с использованием calloc и ввести в него данные?

Подскажите, как определить формат чего-либо введенного с клавиатуры? - C++
Т.е я вывожу сообщение типа:&quot;Введите элементы матрицы..&quot; и если вводится символ, а не число, сообщить об ошибке..вот..

Переписать код без указателей - C++
Ввести в память машины одномерный целочисленный массив,используя динамическое выделение памяти,найти количество максимальных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.06.2014, 06:33     Подскажите как переписать класс с использованием умных указателей, либо STL #2
Цитата Сообщение от Divergence Посмотреть сообщение
А как это засунуть в класс?
C++
1
vector< vector<int> > Matrix;
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
22.06.2014, 06:35     Подскажите как переписать класс с использованием умных указателей, либо STL #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <vector>
#include <iostream>
 
class test
{
private:
   int           Amount;
   int            x;
   std::vector<float> y;
   std::vector<std::vector<double> > z;
public:
 
test(int fAmount)
{
   Amount = fAmount;
   x = Amount;
   y.resize(Amount,0);
   z.resize(Amount);
   for(int i = 0; i < Amount; i++)
      z[i].resize(Amount);
}
void clear()
{
   std::cout<<y.size()<<" "<<y.capacity()<<"\n";
   y.clear(); //Очищает вектор, но не освобождает память, отведенную под данные
   z.clear();
   std::cout<<y.size()<<" "<<y.capacity()<<"\n";
#if __cplusplus > 199711L
   y.shrink_to_fit();
   z.shrink_to_fit();
#else
   std::vector<float> empty_y;
   std::vector<std::vector<double> > empty_z;
   y.swap(empty_y);
   z.swap(empty_z);
#endif
   std::cout<<y.size()<<" "<<y.capacity()<<"\n";
}
 
~test()
{
}
 
};
int main()
{
  test test_inst(100);
  test_inst.clear();
  return 0;
}
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
22.06.2014, 06:45  [ТС]     Подскажите как переписать класс с использованием умных указателей, либо STL #4
Спасибо большое за ответы!
Такая реализация грамотна?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class cTestVectors
{
public:
 
vector< vector<int> > Matrix;   
    
 
    cTestVectors(int x, int y)
    {
        Matrix.resize(x, vector<int>(y));
        
    } //Конец конструктора
    ~cTestVectors()
    {
           Matrix.clear();
//Или здесь нужно через цикл сначала удалить все элементы Matrix[i]???
    }
};
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
22.06.2014, 06:56     Подскажите как переписать класс с использованием умных указателей, либо STL #5
Вектор по-хорошему нужно бы убрать из public, деструктор можно не писать вообще, вектор при удалении освободит память сам.
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
22.06.2014, 06:59  [ТС]     Подскажите как переписать класс с использованием умных указателей, либо STL #6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Вектор по-хорошему нужно бы убрать из public, деструктор можно не писать вообще, вектор при удалении освободит память сам.
О боже, как это шикарно!!!!
Yandex
Объявления
22.06.2014, 06:59     Подскажите как переписать класс с использованием умных указателей, либо STL
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru