Элементарный вопрос по контейнерам.
От: wombat  
Дата: 04.05.07 06:58
Оценка:
Есть код:
#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

Внимание вопрос: откуда взялась еще одна копия и чего именно это копия в данном случае?
Re: Элементарный вопрос по контейнерам.
От: Bell Россия  
Дата: 04.05.07 07:01
Оценка:
Здравствуйте, wombat, Вы писали:

W>Внимание вопрос: откуда взялась еще одна копия и чего именно это копия в данном случае?


Внимание вопрос: сколько раз произошла переаллокация буфера в векторе?

hint:
попробуй добавить строку
aMyClassVector2.reserve(2);

перел добавлением элементов в вектор
Любите книгу — источник знаний (с) М.Горький
Re: Элементарный вопрос по контейнерам.
От: Аноним  
Дата: 04.05.07 07:02
Оценка:
Здравствуйте, wombat, Вы писали:

W>Внимание вопрос: откуда взялась еще одна копия и чего именно это копия в данном случае?

Реаллокация в векторе?
Re[2]: Элементарный вопрос по контейнерам.
От: wombat  
Дата: 04.05.07 07:10
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, wombat, Вы писали:


W>>Внимание вопрос: откуда взялась еще одна копия и чего именно это копия в данном случае?


B>Внимание вопрос: сколько раз произошла переаллокация буфера в векторе?


B>hint:

B>попробуй добавить строку
B>
B>aMyClassVector2.reserve(2);
B>

B>перел добавлением элементов в вектор

Я немного начинающий програмист, поэтому буду задавать идиотские вопросы: получается, что при добавлении очередного элемента в вектор он заново пересоздает все?
Re[3]: Элементарный вопрос по контейнерам.
От: Bell Россия  
Дата: 04.05.07 07:16
Оценка:
Здравствуйте, wombat, Вы писали:

W>Я немного начинающий програмист, поэтому буду задавать идиотские вопросы: получается, что при добавлении очередного элемента в вектор он заново пересоздает все?


Переаллокация происходит, когда заканчивается доступное пространство. Большинство реализаций при каждой переаллокации выделяют буфер в 2 раза большего размера.
Поэкспериментируй с добавлением 3, 4, 5 и более элементов и посмотри на лог.
Ну и имеет смысл почитать хорошую книгу по STL. Например эту
Автор(ы): Джосьютис Н.

Книга посвящена стандартной библиотеке C++, значительно расширяющей
возможности базового языка. Особое внимание уделяется стандартной
библиотеке шаблонов STL — ее многочисленным контейнерам, итераторам,
объектам функций и алгоритмам. Также подробно описана библиотека
потокового ввода/вывода IOStream и другие компоненты стандартной
библиотеки C++: специализированные контейнеры, строки, поддержка
математических вычислений, проблемы интернационализации и т.д. Кроме
подробной документации по всем классам и интерфейсам библиотеки, в
книге также разъясняются многие нетривиальные концепции, а также
рассматриваются практические аспекты программирования, необходимые для
эффективного использования стандартной библиотеки, и типичные ошибки.
Материал поясняется многочисленными примерами. Книга может
использоваться и как учебник, и как справочник. Книга рассчитана на
программистов среднего и высокого уровня.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Элементарный вопрос по контейнерам.
От: wombat  
Дата: 04.05.07 07:27
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, wombat, Вы писали:


W>>Я немного начинающий програмист, поэтому буду задавать идиотские вопросы: получается, что при добавлении очередного элемента в вектор он заново пересоздает все?


B>Переаллокация происходит, когда заканчивается доступное пространство. Большинство реализаций при каждой переаллокации выделяют буфер в 2 раза большего размера.

B>Поэкспериментируй с добавлением 3, 4, 5 и более элементов и посмотри на лог.
B>Ну и имеет смысл почитать хорошую книгу по STL. Например эту
Автор(ы): Джосьютис Н.

Книга посвящена стандартной библиотеке C++, значительно расширяющей
возможности базового языка. Особое внимание уделяется стандартной
библиотеке шаблонов STL — ее многочисленным контейнерам, итераторам,
объектам функций и алгоритмам. Также подробно описана библиотека
потокового ввода/вывода IOStream и другие компоненты стандартной
библиотеки C++: специализированные контейнеры, строки, поддержка
математических вычислений, проблемы интернационализации и т.д. Кроме
подробной документации по всем классам и интерфейсам библиотеки, в
книге также разъясняются многие нетривиальные концепции, а также
рассматриваются практические аспекты программирования, необходимые для
эффективного использования стандартной библиотеки, и типичные ошибки.
Материал поясняется многочисленными примерами. Книга может
использоваться и как учебник, и как справочник. Книга рассчитана на
программистов среднего и высокого уровня.


Благодарю.
Re[3]: Элементарный вопрос по контейнерам.
От: demi США  
Дата: 04.05.07 12:04
Оценка: +1
Здравствуйте, 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 элементов, а не ровно двух.
Не стыдно попасть в дерьмо, стыдно в нём остаться!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.