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

Что происходит при удалении/добавлении элемента в контейнер vector? - C++

Восстановить пароль Регистрация
 
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 100
14.05.2013, 20:30     Что происходит при удалении/добавлении элемента в контейнер vector? #1
Объясните пожалуйста, какие этапы проходят при добавлении и удалении элемента из контейнера
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,927
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 20:32     Что происходит при удалении/добавлении элемента в контейнер vector? #2
Цитата Сообщение от Cend Посмотреть сообщение
Объясните пожалуйста, какие этапы проходят при добавлении и удалении элемента из контейнера
Зависит от реализации
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 100
14.05.2013, 20:33  [ТС]     Что происходит при удалении/добавлении элемента в контейнер vector? #3
А мне не важно, главное суть понять Расскажите пожалуйста про любую
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,927
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 20:35     Что происходит при удалении/добавлении элемента в контейнер vector? #4
Но в общих чертах проверяется хватает ли нам запаса выделенной уже памяти(capacity) и если нет, то перевыделяем. Потом добавление.

Добавлено через 1 минуту
При удалении - вызов деструкторов для удаляемых объектов, сдвиг всего что "правее" удаляемого элемента "влево"
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 100
14.05.2013, 20:37  [ТС]     Что происходит при удалении/добавлении элемента в контейнер vector? #5
А при добавлении элементов методом resize получается на каждый элемент вызывается конструктор?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,927
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 20:41     Что происходит при удалении/добавлении элемента в контейнер vector? #6
Цитата Сообщение от Cend Посмотреть сообщение
А при добавлении элементов методом resize получается на каждый элемент вызывается конструктор?
Да. Конструктор без параметров.
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 100
14.05.2013, 20:48  [ТС]     Что происходит при удалении/добавлении элемента в контейнер vector? #7
А у простых типов char, int, float и структур элементов простых типов конструктора вроде как нет...? Получается в их случае просто выделяется кусок памяти без вызова конструктора? Или нет?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,927
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 20:57     Что происходит при удалении/добавлении элемента в контейнер vector? #8
Цитата Сообщение от Cend Посмотреть сообщение
Получается в их случае просто выделяется кусок памяти без вызова конструктора? Или нет?
Это шаблонный класс, поэтому все одинаково.

Добавлено через 7 минут
Вот Вам интересный пример:
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
#include <iostream>
#include <vector>
 
class A{
public:
    A(){
        std::cout<<"Constructor A"<<std::endl;
        ++count;
    }
    A(const A & src){
        *this=src;
        std::cout<<"Copy constructor A"<<std::endl;
        ++count;
    }
    ~A(){
        std::cout<<"Destructor A"<<std::endl;
        --count;
    }
    static int count;
};
int A::count =0;
int main(){
 
    {
        std::vector<A> vec;
        A a;
        vec.push_back(a);
        vec.push_back(a);
        vec.push_back(a);
    }
 
        std::cout<<A::count<<std::endl;
        system("pause");
}
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 100
14.05.2013, 20:59  [ТС]     Что происходит при удалении/добавлении элемента в контейнер vector? #9
Получается при добавлении множества элементов типа структура простых типов методом resize для каждого элемента вызывается конструктор, который по сути ничего не делает... мне вот этот момент не понятен, вродеж такого не должно быть, не оптимально выходит. Может это дело оптимизирует компилятор?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,927
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 21:09     Что происходит при удалении/добавлении элемента в контейнер vector? #10
Цитата Сообщение от Cend Посмотреть сообщение
вродеж такого не должно быть, не оптимально выходит.
Вы сделали resize - значит теперь в векторе будет другое кол-во элементов(resize увеличивает кол-во элементов, в векторе, а не просто память резервирует), а это значит ,что для каждого из них должен быть вызван конструктор
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 100
14.05.2013, 21:27  [ТС]     Что происходит при удалении/добавлении элемента в контейнер vector? #11
Я просто не соображу. Вот есть еще методы reserve и clear, и у них всех сложность O(n), т.е. зачем-то вызываются конструкторы и деструкторы, когда допустим в случае с clear можно просто объявить его пустым обнулив счетчик элементов. Память при clear всеравно не освобождается, а вероятность что будут добавлены новые элементы есть и для них будут опять вызываться конструкторы... Я что-то не допонимаю, наверняка в этом есть смысл?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 08:39     Что происходит при удалении/добавлении элемента в контейнер vector?
Еще ссылки по теме:

При удалении элемента из списка происходит непонятная ошибка C++
При удалении объектов происходит порча кучи. Конструктор копирования и оператор = переопределены C++
Vector subscript out of range при удалении C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,927
Записей в блоге: 2
Завершенные тесты: 1
15.05.2013, 08:39     Что происходит при удалении/добавлении элемента в контейнер vector? #12
Цитата Сообщение от Cend Посмотреть сообщение
когда допустим в случае с clear можно просто объявить его пустым обнулив счетчик элементов.
Тогда объект так и останется не уничтоженным. А там во-первых, могла быть выделена динамически память, во-вторых, подсчет ссылок и тому подобное. В приведенном мною примере уберите деструктор. И в конце получите уже не ноль, хотя должен быть именно ноль

Добавлено через 2 минуты
Для простых типов его можно просто объявить пустым, а для корректного удаления объектов сложных классов необходим вызов деструктора.
Yandex
Объявления
15.05.2013, 08:39     Что происходит при удалении/добавлении элемента в контейнер vector?
Ответ Создать тему
Опции темы

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