Просто повертаюся до використання С ++ і намагаюся перетворити просту програму Java, яку я писав нещодавно.
Що є кращим еквівалентом Java ArrayList у C ++?
Просто повертаюся до використання С ++ і намагаюся перетворити просту програму Java, яку я писав нещодавно.
Що є кращим еквівалентом Java ArrayList у C ++?
Відповіді:
Використовуйте std::vectorклас зі стандартної бібліотеки.
std::list, хоча тоді ви втратите невизначеність (ні operator[]), тож це насправді не масив. listщо має свої власні особливості, що vectorчасто є кращим вибором. У стандартних контейнерах C ++ вам доведеться піти на компроміс в тій чи іншій мірі. Подивіться deque, це може запропонувати вам кращий вибір. Це (відносно) легко виміряти vectorпроти dequevs, 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 ++.