1 / 1 / 0
Регистрация: 23.03.2014
Сообщений: 79
|
|
1 | |
Реализация vector18.05.2015, 23:09. Показов 6107. Ответов 4
Метки нет (Все метки)
Скажите, можно ли где-то посмотреть как примерно реализуются контейнерные классы STL или аналогичных шаблонных библиотек?
Меня, в частности, интересует шаблонный класс vector. Не укладывается в голове как могут быть созданы объекты типа вектор векторов. Ведь если vector - это массив, то каким образом он может содержать элементы разного размера, причем размер каждого элемента может динамически изменяться.
0
|
18.05.2015, 23:09 | |
Ответы с готовыми решениями:
4
Реализация класса Vector Примерная реализация std vector bool Реализация контейнера идентичного std::vector по Страуструпу Нужна реализация функции std::vector::insert() |
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
18.05.2015, 23:16 | 2 |
так же как в СИ был двухмерный массив, размер элементов которых могу измениться
0
|
1 / 1 / 0
Регистрация: 23.03.2014
Сообщений: 79
|
|
18.05.2015, 23:28 [ТС] | 3 |
Т.е. объект vector содержит указатель на массив указателей в heap?
0
|
Форумчанин
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
18.05.2015, 23:44 | 4 |
Сообщение было отмечено schdub как решение
Решение
В хедерах своего компилятора.
http://research.microsoft.com/... ource.html Добавлено через 2 минуты Списки, стеки, очереди
1
|
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
|
||||||
18.05.2015, 23:57 | 5 | |||||
в векторе содержатся объекты одного размера, но их количество меняется по ходу заполнения вектора.
допустим вектор для объектов типа int, которые в памяти занимают 8 байт. в этом случае внутри вектора динамически выделяется массив, в который можно было бы уместить скажем 16 таких объектов. т.е. размер массива в байтах: 8*16. внутри вектора есть счетчики, сколько объектов в текущий массив может быть помещено и сколько реально помещено. при очередной операции вставки в вектор код проверяет, а влезет ли новый объект в этот массив. если да, то в нужной мозиции массива инициализируется этот объект. если не влазиет, то внутри вектора создается новый динамический массив который больше предыдущего скажем раза в два. из старого массива в новый копируются все объекты, которые в нем были + в конец втыкается новый объект, из-за которого это перераспределение было затеяно. старый массив удаляется. далее все повторяется. втыкаются новые объекты до тех пор, пока массива хватает. как только перестает хватать - все по новом. создается новый массив еще большего размера ... Добавлено через 7 минут по поводу вектора векторов: статический размер вектора всегда одинаковый и известен во время компиляции. если вектор сделан как я описал выше, то его размер будет складываться из размера его членов данных:
в случае, когда Type - это какой-то вектор, ничего не меняется, т.к. размер указателя на что-то всегда одинаковый и известен во время компиляции.
0
|
18.05.2015, 23:57 | |
18.05.2015, 23:57 | |
Помогаю со студенческими работами здесь
5
Четырехмерный массив (реализация через библиотеку vector) Реализация своего std::vector c аллокатором памяти error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |