Просто повертаюся до використання С ++ і намагаюся перетворити просту програму Java, яку я писав нещодавно.
Що є кращим еквівалентом Java ArrayList у C ++?
Просто повертаюся до використання С ++ і намагаюся перетворити просту програму Java, яку я писав нещодавно.
Що є кращим еквівалентом Java ArrayList у C ++?
Відповіді:
Використовуйте std::vector
клас зі стандартної бібліотеки.
std::list
, хоча тоді ви втратите невизначеність (ні operator[]
), тож це насправді не масив. list
що має свої власні особливості, що vector
часто є кращим вибором. У стандартних контейнерах C ++ вам доведеться піти на компроміс в тій чи іншій мірі. Подивіться deque
, це може запропонувати вам кращий вибір. Це (відносно) легко виміряти vector
проти deque
vs, list
оскільки вони в основному взаємозамінні в коді - просто використовуйте typedef для вашого контейнера, наприклад typedef vector<MyObj> MyList
.
ArrayList
як ви можете здогадатися з назви, також не реалізований як пов'язаний список. Можливо, ти думаєш про це LinkedList
. Крім того, навіть якщо у вас досить великий оборот об’єктів, доданих і вилучених зі списку, vector
все одно може бути швидшим, ніж до list
тих пір, поки ви виділите для нього достатньо місця, щоб його не потрібно було перерозподіляти (тобто, дати йому максимальний простір, який йому коли-небудь знадобиться).
Кілька додаткових пунктів повторно використовують vector
тут.
В відміну ArrayList
і Array
в Java, вам не потрібно робити нічого особливого , щоб лікувати vector
як масив - основний пам'яті в C ++ гарантовано бути безперервним і ефективно індексованих.
На відміну від цього ArrayList
, a vector
може ефективно утримувати примітивні типи без інкапсуляції як повноцінний об’єкт.
Виймаючи предмети з vector
, пам’ятайте, що предмети над вилученим предметом потрібно переміщати вниз, щоб зберегти суцільне зберігання. Для великих контейнерів це може коштувати дорого.
Переконайтеся, що якщо ви зберігаєте складні об’єкти в тому, vector
що їх конструктор копіювання та оператори присвоєння ефективні. Під ковдрами C ++ STL використовує їх під час ведення контейнера.
Порада щодо reserve()
попереднього введення сховища (тобто під час побудови вектора або часу ініціалізації) для мінімізації перерозподілу пам'яті при подальшому розширенні переноситься з Java на C ++.