2014-09-24 2 views
1

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

Я получил отличный ответ, который заставило меня понять, что мне нужно понять: зачем использовать 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 является (беззнаковое целое) тип данных и следует использовать для указания, что это значение должно представлять размер п объекта.

Для того, чтобы понять поведение 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?

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

Благодарим вас за ваше время и терпение, я очень ценю это.

ответ

3

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

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

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

+0

Спасибо, мистер Фот. Если я могу отслеживать: так в чем преимущество включения size_t в конструктор, когда размер контейнера, который наследует его значение, предопределен? (vect (size_t n): m (n) {}) – Vincent

+0

"size_t - это тип, возвращаемый оператором sizeof и широко используемый в стандартной библиотеке для представления размеров * и count *." В конструкторе аргумент 'size_t' используется как * число * элементов, а не как размер чего-либо в байтах. –

+0

спасибо. Я знаю, что мои вопросы кажутся довольно смущающими, но я действительно пытался понять, что там происходит. Поэтому снова я очень ценю ваши ответы. – Vincent

Смежные вопросы