Разница заключается в том, что хранится в объекте CArray
и как оно хранится в объекте, являются ли элементы CArray
объектами или указателями на объекты какого-либо класса.
CArray
, похоже, имеет несколько неожиданных действий. Он существует уже давно и предназначен для установки в экосистему MFC. Стандартная библиотека шаблонов C++ vector
имеет гораздо более приятные и более общие характеристики, особенно при работе с объектами, отличными от простых типов данных.
Мой опыт работы с использованием CList
и CArray
с указателями на объекты. Выполняя это, они кажутся более предсказуемыми, хотя вам нужно беспокоиться об управлении памятью.
Один из вопросов, глядя на источнике в afxtempl.h
является то, что, когда CArray
производится больше через внутреннюю функцию SetSize()
, memcpy_s()
функции используется для копирования CArray
элементов из одной области памяти в другую. Поэтому вам нужно быть осторожным с указателями и мелким копированием элементов CArray
. А так как memcpy_s()
используется, а не memmove_s()
, если вы делаете что-то напуганное с облаками памяти с большим объемом, может возникнуть проблема.
Возможно, поэтому мой опыт работы с CArray
в качестве контейнера для указателей на объекты кажется намного лучше.
Интересно то, что выглядит как Append()
и Copy()
методы используют внутреннюю функцию CopyElements()
которая выполняет элемент по заданию элемента, а не вызов memcpy_s()
функции. Однако эти методы используются с объектами CArray
, а не с отдельными элементами.
CArray
получен из CObject
, что означает, что структура данных будет иметь весь багаж CObject
. Однако есть и некоторые хорошие вещи, которые CObject
вносит в мир MFC, например, сериализацию.
Похоже, что вы должны использовать ссылку как второй аргумент шаблона, поэтому вы должны использовать CArray <SomeClass, SomeClass &> collection;
, если вы используете класс. Я столкнулся с проблемами, когда не делал этого, пока не обнаружил раздел Создание массива от MFC Collections: The CArray Class.
and std :: vector? – Andrey
-1: Это не почему. вектор делает то же самое –