Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 121
1

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

14.05.2013, 20:30. Показов 1572. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Объясните пожалуйста, какие этапы проходят при добавлении и удалении элемента из контейнера
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2013, 20:30
Ответы с готовыми решениями:

При добавлении (удалении) данных в DataGrid не происходит обновление
Пытаюсь создать часть приложения, которая позволяет работать со списком пользователей...

Возникает ли событие в Listbox при добавлении или удалении элемента
Привет! Ребят, есть ли у Listbox событие, когда добавляется или удаляется item? Просмотрел...

При удалении элемента из списка происходит непонятная ошибка
Приложила файл, который должен лежать в папке с кодом. При выполнении на первом поиске ищете...

Что происходит внутри Windows при установке и удалении программ?
Привет всем. Интересует такой вопрос: какие процессы происходят когда мы устанавливаем...

11
Неэпический
18105 / 10692 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
14.05.2013, 20:32 2
Цитата Сообщение от Cend Посмотреть сообщение
Объясните пожалуйста, какие этапы проходят при добавлении и удалении элемента из контейнера
Зависит от реализации
1
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 121
14.05.2013, 20:33  [ТС] 3
А мне не важно, главное суть понять Расскажите пожалуйста про любую
0
Неэпический
18105 / 10692 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
14.05.2013, 20:35 4
Но в общих чертах проверяется хватает ли нам запаса выделенной уже памяти(capacity) и если нет, то перевыделяем. Потом добавление.

Добавлено через 1 минуту
При удалении - вызов деструкторов для удаляемых объектов, сдвиг всего что "правее" удаляемого элемента "влево"
1
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 121
14.05.2013, 20:37  [ТС] 5
А при добавлении элементов методом resize получается на каждый элемент вызывается конструктор?
0
Неэпический
18105 / 10692 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
14.05.2013, 20:41 6
Цитата Сообщение от Cend Посмотреть сообщение
А при добавлении элементов методом resize получается на каждый элемент вызывается конструктор?
Да. Конструктор без параметров.
1
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 121
14.05.2013, 20:48  [ТС] 7
А у простых типов char, int, float и структур элементов простых типов конструктора вроде как нет...? Получается в их случае просто выделяется кусок памяти без вызова конструктора? Или нет?
0
Неэпический
18105 / 10692 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
14.05.2013, 20:57 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");
}
1
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 121
14.05.2013, 20:59  [ТС] 9
Получается при добавлении множества элементов типа структура простых типов методом resize для каждого элемента вызывается конструктор, который по сути ничего не делает... мне вот этот момент не понятен, вродеж такого не должно быть, не оптимально выходит. Может это дело оптимизирует компилятор?
0
Неэпический
18105 / 10692 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
14.05.2013, 21:09 10
Цитата Сообщение от Cend Посмотреть сообщение
вродеж такого не должно быть, не оптимально выходит.
Вы сделали resize - значит теперь в векторе будет другое кол-во элементов(resize увеличивает кол-во элементов, в векторе, а не просто память резервирует), а это значит ,что для каждого из них должен быть вызван конструктор
0
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 121
14.05.2013, 21:27  [ТС] 11
Я просто не соображу. Вот есть еще методы reserve и clear, и у них всех сложность O(n), т.е. зачем-то вызываются конструкторы и деструкторы, когда допустим в случае с clear можно просто объявить его пустым обнулив счетчик элементов. Память при clear всеравно не освобождается, а вероятность что будут добавлены новые элементы есть и для них будут опять вызываться конструкторы... Я что-то не допонимаю, наверняка в этом есть смысл?
0
Неэпический
18105 / 10692 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
15.05.2013, 08:39 12
Цитата Сообщение от Cend Посмотреть сообщение
когда допустим в случае с clear можно просто объявить его пустым обнулив счетчик элементов.
Тогда объект так и останется не уничтоженным. А там во-первых, могла быть выделена динамически память, во-вторых, подсчет ссылок и тому подобное. В приведенном мною примере уберите деструктор. И в конце получите уже не ноль, хотя должен быть именно ноль

Добавлено через 2 минуты
Для простых типов его можно просто объявить пустым, а для корректного удаления объектов сложных классов необходим вызов деструктора.
0
15.05.2013, 08:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2013, 08:39
Помогаю со студенческими работами здесь

Реализовать List так, что при добавлении элемента в конец, удаляется тот, что в начале
Добрый день. Не как не могу найти готовый способ цикличного листа, пример: у нас есть лист размером...

Ошибка при добавлении и удалении
В чем ошибка? при добавлении студента у меня фамилия пишется в поле номера зачётки, а номер зачётки...

Vector subscript out of range при удалении
Здравствуйте! Не понимаю, как решить проблему. Помогите, кто может. #include &quot;group.h&quot;...

Пауза при удалении, добавлении класса
Нужно с паузой удалить класс. Вот так не работает: ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru