структуры данных — C ++ понимает поведение size_t для создания вектора

это следующее до этого https://softwareengineering.stackexchange.com/questions/256241/c-coding-practice-class-vs-free-functions вопрос я выложил несколько дней назад. Короче говоря, идея состоит в том, чтобы создать собственный векторный класс для статистического анализа данных.

Я получил отличный ответ, который заставил меня понять, что мне нужно понять: зачем использовать size_t в конструкторе класса контейнера и зачем вообще его использовать?

Вот часть предложенного решения:

template<class T>
class vect
{
std::vector<T> m;

public:
vect(size_t n) :m(n) {}
void addTo(T a){ m.push_back(a); }
std::vector<T> get() const { return m;}
... more functions and overloaded operators
};

Я понимаю, что size_t является типом данных (unsigned int) и должен использоваться для указания того, что его значение должно представлять размер объекта n.

Чтобы понять поведение size_t, я сделал следующее:

int main() {
vect<int> m(0);
vect<int> n(100);
std::cout << sizeof(n) << std::endl;
std::cout << sizeof(m) << std::endl;
std::cout << sizeof(m.get()) << std::endl;
for (int i = 0 ; i < 100; i++) {
m.addTo(i);
}

std::cout << sizeof(m) << std::endl;
std::cout << sizeof(m.get()) << std::endl;

}

все из которых возвращают «24». (Я ожидал изменения в размере объекта после добавления параметров к нему.) Однако:

    for(int i = 0; i<100;i++)
std::cout << m[i] << std::endl;

красиво выводит все значения от 0 до 100. Таким образом, я знаю, что в векторе хранится 100 целых чисел, но почему его размер равен 24, а не 100?

Очевидно, я новичок в программировании на С ++, и, что еще хуже, это мой первый шаблонный класс.

Спасибо за ваше время и терпение, я действительно ценю это.

1

Решение

sizeof касается размера тип в памяти. Ваш vect класс это тип, который занимает 24 байта. Размер типа никогда не изменяется после его компиляции.

Но как ваш вектор может хранить столько информации, не меняя ее размера? Поскольку он содержит указатели на другие вещи, которые могут занимать гораздо больше места (на самом деле, они могут занимать столько места, сколько вам нужно — вот почему их называют динамический структуры данных). Предположительно ваш vect Экземпляр содержит указатель на стандартный векторный класс, который содержит другие указатели, возможно, на массив или динамически выделяемый раздел памяти, который содержит фактические данные.

Вы не можете запросить размер этих частных битов памяти, на которые ссылаются косвенно, потому что вы не знаете ни их имени, ни их типа. На самом деле, основная причина создания таких контейнерных классов заключается в том, что вы не иметь знать, сколько памяти выделить — вы просто вбиваете в них вещи, и они молча выделяют столько памяти, сколько необходимо.

3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector