Есть код:
#include "stdafx.h"
namespace std{};
using namespace std;
#include "vector"
class CMyClass{
public:
CMyClass(){printf("Create\n");}
CMyClass(const CMyClass &src){printf("Copy create\n");};
~CMyClass(){printf("Delete\n");}
void SayHello(){printf("Hi\n");};
void SaySomething(){printf("Something\n");};
};
int main(int argc, char* argv[])
{
vector<CMyClass> aMyClassVector2;
CMyClass temp;
temp.SayHello();
aMyClassVector2.push_back(temp);
aMyClassVector2.push_back(temp);
return 0;
}
По идее, результат, появляющийся на экране, должен иметь вид:
Create
Hi
Copy create
Copy create
Delete
Delete
Delele
однако имеем:
Create
Hi
Copy create
Copy create
Copy create
Delete
Delete
Delele
Delele
Внимание вопрос: откуда взялась еще одна копия и чего именно это копия в данном случае?
Здравствуйте, wombat, Вы писали:
W>Внимание вопрос: откуда взялась еще одна копия и чего именно это копия в данном случае?
Внимание вопрос: сколько раз произошла переаллокация буфера в векторе?
hint:
попробуй добавить строку
aMyClassVector2.reserve(2);
перел добавлением элементов в вектор
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, wombat, Вы писали:
W>>Внимание вопрос: откуда взялась еще одна копия и чего именно это копия в данном случае?
B>Внимание вопрос: сколько раз произошла переаллокация буфера в векторе?
B>hint:
B>попробуй добавить строку
B>B>aMyClassVector2.reserve(2);
B>
B>перел добавлением элементов в вектор
Я немного начинающий програмист, поэтому буду задавать идиотские вопросы: получается, что при добавлении очередного элемента в вектор он заново пересоздает все?
Здравствуйте, wombat, Вы писали:
W>Я немного начинающий програмист, поэтому буду задавать идиотские вопросы: получается, что при добавлении очередного элемента в вектор он заново пересоздает все?
Переаллокация происходит, когда заканчивается доступное пространство. Большинство реализаций при каждой переаллокации выделяют буфер в 2 раза большего размера.
Поэкспериментируй с добавлением 3, 4, 5 и более элементов и посмотри на лог.
Ну и имеет смысл почитать хорошую книгу по STL. Например
этуАвтор(ы): Джосьютис Н.
Книга посвящена стандартной библиотеке C++, значительно расширяющей
возможности базового языка. Особое внимание уделяется стандартной
библиотеке шаблонов STL — ее многочисленным контейнерам, итераторам,
объектам функций и алгоритмам. Также подробно описана библиотека
потокового ввода/вывода IOStream и другие компоненты стандартной
библиотеки C++: специализированные контейнеры, строки, поддержка
математических вычислений, проблемы интернационализации и т.д. Кроме
подробной документации по всем классам и интерфейсам библиотеки, в
книге также разъясняются многие нетривиальные концепции, а также
рассматриваются практические аспекты программирования, необходимые для
эффективного использования стандартной библиотеки, и типичные ошибки.
Материал поясняется многочисленными примерами. Книга может
использоваться и как учебник, и как справочник. Книга рассчитана на
программистов среднего и высокого уровня.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, wombat, Вы писали:
W>>Я немного начинающий програмист, поэтому буду задавать идиотские вопросы: получается, что при добавлении очередного элемента в вектор он заново пересоздает все?
B>Переаллокация происходит, когда заканчивается доступное пространство. Большинство реализаций при каждой переаллокации выделяют буфер в 2 раза большего размера.
B>Поэкспериментируй с добавлением 3, 4, 5 и более элементов и посмотри на лог.
B>Ну и имеет смысл почитать хорошую книгу по STL. Например этуАвтор(ы): Джосьютис Н.
Книга посвящена стандартной библиотеке C++, значительно расширяющей
возможности базового языка. Особое внимание уделяется стандартной
библиотеке шаблонов STL — ее многочисленным контейнерам, итераторам,
объектам функций и алгоритмам. Также подробно описана библиотека
потокового ввода/вывода IOStream и другие компоненты стандартной
библиотеки C++: специализированные контейнеры, строки, поддержка
математических вычислений, проблемы интернационализации и т.д. Кроме
подробной документации по всем классам и интерфейсам библиотеки, в
книге также разъясняются многие нетривиальные концепции, а также
рассматриваются практические аспекты программирования, необходимые для
эффективного использования стандартной библиотеки, и типичные ошибки.
Материал поясняется многочисленными примерами. Книга может
использоваться и как учебник, и как справочник. Книга рассчитана на
программистов среднего и высокого уровня.
Благодарю.
Здравствуйте, wombat, Вы писали:
W>Здравствуйте, Bell, Вы писали:
B>>Здравствуйте, wombat, Вы писали:
W>>>Внимание вопрос: откуда взялась еще одна копия и чего именно это копия в данном случае?
B>>Внимание вопрос: сколько раз произошла переаллокация буфера в векторе?
B>>hint:
B>>попробуй добавить строку
B>>B>>aMyClassVector2.reserve(2);
B>>
B>>перел добавлением элементов в вектор
W>Я немного начинающий програмист, поэтому буду задавать идиотские вопросы: получается, что при добавлении очередного элемента в вектор он заново пересоздает все?
Ф перлы! Про немного беременных женщин слышали?
Дело как заметил
Bell в том что вектор перераспеделяет память, в которой хрянятся объекты. Как он это делает — не знает даже стандарт

Ну не оговаривает в смысле. Он может на 2 элемента зарезервировать а может и на 10. Даже v.reserve(2) означает (кстати, по стандарту

) что будет выделенно памяти достаточное для хранения
не менее 2 элементов, а не
ровно двух.