С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 114
#1

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

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

Объясните пожалуйста, какие этапы проходят при добавлении и удалении элемента из контейнера
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 20:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что происходит при удалении/добавлении элемента в контейнер vector? (C++):

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

Vector subscript out of range при удалении - C++
Здравствуйте! Не понимаю, как решить проблему. Помогите, кто может. #include "group.h" (нужная часть) typedef struct { ...

При удалении объектов происходит порча кучи. Конструктор копирования и оператор = переопределены - C++
Всем добрый день, возникла небольшая проблема, может кто-то подскажет, что происходит? Бьюсь уже четвёртые сутки, не могу понять, где...

Вылетает программа при удалении элемента вектора - C++
Всех с новым годом, уважаемые киберфорумцы! Сделал я на днях класс Button, который, как и положено, представляет из себя кнопку (работаю...

При удалении элемента из списка вылетает программа - C++
Здравствуйте, помогите, пожалуйста. У меня есть программа по работе с классами и списком (код ниже). Добавление элементов в список и их...

контейнер vector - C++
Как я понимаю, vector представляет собой что-то вроде динамического массива. Но массивы бывают одномерные,двумерные и так далее. Есть ли...

11
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
14.05.2013, 20:32 #2
Цитата Сообщение от Cend Посмотреть сообщение
Объясните пожалуйста, какие этапы проходят при добавлении и удалении элемента из контейнера
Зависит от реализации
1
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 114
14.05.2013, 20:33  [ТС] #3
А мне не важно, главное суть понять Расскажите пожалуйста про любую
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
14.05.2013, 20:35 #4
Но в общих чертах проверяется хватает ли нам запаса выделенной уже памяти(capacity) и если нет, то перевыделяем. Потом добавление.

Добавлено через 1 минуту
При удалении - вызов деструкторов для удаляемых объектов, сдвиг всего что "правее" удаляемого элемента "влево"
1
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 114
14.05.2013, 20:37  [ТС] #5
А при добавлении элементов методом resize получается на каждый элемент вызывается конструктор?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
14.05.2013, 20:41 #6
Цитата Сообщение от Cend Посмотреть сообщение
А при добавлении элементов методом resize получается на каждый элемент вызывается конструктор?
Да. Конструктор без параметров.
1
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 114
14.05.2013, 20:48  [ТС] #7
А у простых типов char, int, float и структур элементов простых типов конструктора вроде как нет...? Получается в их случае просто выделяется кусок памяти без вызова конструктора? Или нет?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 114
14.05.2013, 20:59  [ТС] #9
Получается при добавлении множества элементов типа структура простых типов методом resize для каждого элемента вызывается конструктор, который по сути ничего не делает... мне вот этот момент не понятен, вродеж такого не должно быть, не оптимально выходит. Может это дело оптимизирует компилятор?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
14.05.2013, 21:09 #10
Цитата Сообщение от Cend Посмотреть сообщение
вродеж такого не должно быть, не оптимально выходит.
Вы сделали resize - значит теперь в векторе будет другое кол-во элементов(resize увеличивает кол-во элементов, в векторе, а не просто память резервирует), а это значит ,что для каждого из них должен быть вызван конструктор
0
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 114
14.05.2013, 21:27  [ТС] #11
Я просто не соображу. Вот есть еще методы reserve и clear, и у них всех сложность O(n), т.е. зачем-то вызываются конструкторы и деструкторы, когда допустим в случае с clear можно просто объявить его пустым обнулив счетчик элементов. Память при clear всеравно не освобождается, а вероятность что будут добавлены новые элементы есть и для них будут опять вызываться конструкторы... Я что-то не допонимаю, наверняка в этом есть смысл?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
15.05.2013, 08:39 #12
Цитата Сообщение от Cend Посмотреть сообщение
когда допустим в случае с clear можно просто объявить его пустым обнулив счетчик элементов.
Тогда объект так и останется не уничтоженным. А там во-первых, могла быть выделена динамически память, во-вторых, подсчет ссылок и тому подобное. В приведенном мною примере уберите деструктор. И в конце получите уже не ноль, хотя должен быть именно ноль

Добавлено через 2 минуты
Для простых типов его можно просто объявить пустым, а для корректного удаления объектов сложных классов необходим вызов деструктора.
0
15.05.2013, 08:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 08:39
Привет! Вот еще темы с ответами:

При удалении первого элемента из динамического списка присваивается плохой указатель - C++
Проблема появляется только при удалении первого элемента. // Запись содержит марку автобуса, максимальную скорость, вместимость. //...

Контейнер std::vector - C++
Помогите определить почему не работает задача. Оибку выбивает на строку k.push_back(0); #include &lt;iostream&gt; #include &lt;math.h&gt; ...

Программа вылетает при добавлении элемента - C++
Написал программу Car, в которой реализовал функции Add и Delete нового авто, только из-за какого-то исключения нарушаются права доступа и...

Программа вылетает при добавлении элемента - C++
Здравствуйте ув. форумчане. Есть у меня в программе массив первого и второго типа. При начальном создание (мы выбераем сами количество...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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