Що таке версія ArrayList Java на C ++


Відповіді:


88

Використовуйте std::vectorклас зі стандартної бібліотеки.


3
Мда ... з іншої відповіді, здається, вектор не реалізований як зв’язаний список? Я правий? Я використовую цей список як колекцію, яка матиме досить високий оборот доданих та видалених з нього об’єктів. Цей масив насправді є найкращою реалізацією? Або існує версія зі зв’язаним списком?
interstar

5
@interstar - абсолютно правильно. Якщо ви дійсно хочете семантику зв’язаного списку, тоді використовуйте std::list, хоча тоді ви втратите невизначеність (ні operator[]), тож це насправді не масив. listщо має свої власні особливості, що vectorчасто є кращим вибором. У стандартних контейнерах C ++ вам доведеться піти на компроміс в тій чи іншій мірі. Подивіться deque, це може запропонувати вам кращий вибір. Це (відносно) легко виміряти vectorпроти dequevs, listоскільки вони в основному взаємозамінні в коді - просто використовуйте typedef для вашого контейнера, наприклад typedef vector<MyObj> MyList.
Стів Таунсенд,

ну спробую спочатку вектор. Тому що індекс корисний. Якщо це занадто повільно, я можу перейти до пов'язаного списку. Дякую
interstar

2
@interstar, ArrayListяк ви можете здогадатися з назви, також не реалізований як пов'язаний список. Можливо, ти думаєш про це LinkedList. Крім того, навіть якщо у вас досить великий оборот об’єктів, доданих і вилучених зі списку, vectorвсе одно може бути швидшим, ніж до listтих пір, поки ви виділите для нього достатньо місця, щоб його не потрібно було перерозподіляти (тобто, дати йому максимальний простір, який йому коли-небудь знадобиться).
Kyle Strand

@KyleStrand Це цікаво. Я завжди припускав, що ArrayList мав на увазі "масивноподібну річ, яка реалізована як пов'язаний список", а не "пов'язану спискову річ, яка реалізована як масив".
міжзіркова

63

Кілька додаткових пунктів повторно використовують vectorтут.

В відміну ArrayListі Arrayв Java, вам не потрібно робити нічого особливого , щоб лікувати vectorяк масив - основний пам'яті в C ++ гарантовано бути безперервним і ефективно індексованих.

На відміну від цього ArrayList, a vectorможе ефективно утримувати примітивні типи без інкапсуляції як повноцінний об’єкт.

Виймаючи предмети з vector, пам’ятайте, що предмети над вилученим предметом потрібно переміщати вниз, щоб зберегти суцільне зберігання. Для великих контейнерів це може коштувати дорого.

Переконайтеся, що якщо ви зберігаєте складні об’єкти в тому, vectorщо їх конструктор копіювання та оператори присвоєння ефективні. Під ковдрами C ++ STL використовує їх під час ведення контейнера.

Порада щодо reserve()попереднього введення сховища (тобто під час побудови вектора або часу ініціалізації) для мінімізації перерозподілу пам'яті при подальшому розширенні переноситься з Java на C ++.


6
Кращою відповіддю, безумовно, має бути прийнята.
Пол Руні,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.