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

Стандартный векторный контейнер - C++

Восстановить пароль Регистрация
 
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
14.08.2013, 17:09     Стандартный векторный контейнер #1
"Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete(), т.е. для создания нового элемента вызывается стандартный конструктор класса Т. Это служит еще одним аргументом в пользу явного определения стандартного конструктора в создаваемых классах. Если этого не сделать, то нельзя будет использовать стандартный векторный контейнер для хранения объектов пользовательского класса"
Вопрос: почему для использования стандартного векторного контейнера необходимо явно определять стандартный конструктор класса? Ведь, стандартный конструктор класса, даже, если мы его не определили, он все равно создается компилятором.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 17:09     Стандартный векторный контейнер
Посмотрите здесь:

C++ Стандартный класс complex.
C++ дана матрица А(5,5). Получить векторный столбец, элементы которого являются наибольшими по модулю элементов исходной матрицы
Двумерный динамический массив (Получить векторный столбец, элементы которого являются наименьшим по модулю столбцов исходной матрицы) C++
Класс как стандартный контейнер C++
C++ Приватный конструктор и стандартный контейнер. Два барана на мосту
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
14.08.2013, 17:15     Стандартный векторный контейнер #2
Цитата Сообщение от Erjay Посмотреть сообщение
Ведь, стандартный конструктор класса, даже, если мы его не определили, он все равно создается компилятором.
Если только нет других конструкторов
Цитата Сообщение от Erjay Посмотреть сообщение
Если этого не сделать, то нельзя будет использовать стандартный векторный контейнер для хранения объектов пользовательского класса"
Почему?
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
14.08.2013, 17:18  [ТС]     Стандартный векторный контейнер #3
Croessmah,
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему?
То есть, все таки, можно будет?! Это, кстати, из книги Либерти.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
14.08.2013, 17:27     Стандартный векторный контейнер #4
Цитата Сообщение от Erjay Посмотреть сообщение
То есть, все таки, можно будет?
http://ideone.com/0MedUY
Цитата Сообщение от Erjay Посмотреть сообщение
Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete()
не факт!
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
14.08.2013, 18:07     Стандартный векторный контейнер #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
class A
{
public:
   A(int x_)
       :x(x_)
   {}
 
private:
   int x ;
} ;
 
int main()
{
   std::vector<A>   vec(5);
}
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
14.08.2013, 18:25     Стандартный векторный контейнер #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
class A
{
public:
   A(int x_)
       :x(x_)
   {}
 
private:
   int x ;
} ;
 
int main()
{
   std::vector<A> vec(5,4); // size=5, val=4;
}
C++
1
2
explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());
http://www.cplusplus.com/reference/v...vector/vector/
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6165 / 2894 / 282
Регистрация: 04.12.2011
Сообщений: 7,694
Записей в блоге: 3
14.08.2013, 18:31     Стандартный векторный контейнер #7
Erjay, у шаблона вектор много конструкторов и не обязательно требовать наличие конструктора по умолчанию. Тему проще понять на примере инициализации динамического массива.
Дело в том, что при выделении памяти под переменную одиночного значения, язык предоставляет возможность сразу его инициализировать необходимым значением:
C++
1
int *b = new int(123);//выделение и инициализация. Для динамических массивов это невозможно.
но нет возможности так поступить с массивом. Нельзя написать, что-то похожее на:
C++
1
int *c = new int[]({1, 2, 3});  //было бы удобно но ничего подобного нет)
Возможна, например запись:
C++
1
int *c = new int[3];
которая не в состоянии принять каких либо значений для инициализации, она только выделяет память. Для int например, эта память вообще не инициализируется и содержит мусор.
Зато если есть конструктор по умолчанию (от компилятора или определённый явно, неважно), то компилятор знает что ему делать видя запись:
C++
1
MyClass *d = new MyClass[3];
Оператор выделения памяти трижды вызовет конструктор по умолчанию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2013, 18:36     Стандартный векторный контейнер
Еще ссылки по теме:

C++ Стандартный jpg компрессор
C++ Векторный калькулятор на классах
Перевести на стандартный С++ C++

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
14.08.2013, 18:36     Стандартный векторный контейнер #8
Цитата Сообщение от Erjay Посмотреть сообщение
Вопрос: почему для использования стандартного векторного контейнера необходимо явно определять стандартный конструктор класса?
Для того что бы в дальнейшем не думать откуда ошибки лезут...

Если конструируешь класс то нужно предусмотреть стандартный, полный и понятный интерфейс для другого программиста...
Если "конструкция" изначально специфическая то естественно чего-то может не быть или работать не стандартно, в том числе какого-то конструктора может не быть...
Yandex
Объявления
14.08.2013, 18:36     Стандартный векторный контейнер
Ответ Создать тему
Опции темы

Текущее время: 22:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru