Как контейнеры STL копируют объекты?

Я считаю, что ваша коллекция должна быть одного типа MyClass (как и в T, должна быть одинаковой), потому что компилятор не будет знать, какие типы вы добавили к каким элементам в коллекции.

Другими словами, если вам нужно добавить 2 элемента в список:

list.Add(new MyClass());
list.Add(new MyClass());

, то попробуйте сослаться на один из них:

var myItem = list[1];

Компилятор не знает, что общего был назначен списку MyClass в элементе 1 , потому что элементы добавляются во время выполнения, но общие значения определяются во время компиляции.

Я уверен, что то, что вы хотите сделать, не может быть сделано.


Если вы заранее знаете количество элементов, возможно, вы могли бы использовать кортеж ?

11
задан mdb 7 November 2009 в 13:39
поделиться

2 ответа

Вероятно, он использует «размещение новый » для создания объекта на месте во внутреннем массиве. Размещение новое не выделяет памяти; он просто помещает объект в указанное вами место и вызывает конструктор. Синтаксис: новый (адрес) Class (constructor_arguments) .

Конструктор копирования T :: T (T const &) вызывается для создания копии на месте. Примерно так (упрощенно):

template<T>
void vector<T>::push_back(T const &item) {
    // resize if necessary
    new (&d_array[d_size++]) T(item);
}

Обратите внимание, что T должен иметь конструктор копирования, чтобы это работало. По умолчанию (если вы ничего не делаете) он получает один бесплатно. Если вы определите его явно, он должен быть public , чтобы vector работал.

Вот как это делает библиотека GNU libstdc ++ , но я сомневаюсь, что это будет быть очень поучительным.

12
ответ дан 3 December 2019 в 07:38
поделиться

Он использует оператор размещения new и копирует его в единичную память;

Размещение new создает новый элемент по указанному адресу в памяти, в векторном случае, текущий конец ();

void push_back(const T& val){
::new (&*end()) T(val);
[increase end]
}

посмотрите на http://spotep.com/dev/devector.h , который имеет довольно четкий код (в отличие от большинства реализаций STL).

1
ответ дан 3 December 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: