Динамический размер массива в C ++? - PullRequest
0 голосов
/ 11 августа 2011

Я в замешательстве.Я не знаю, какие контейнеры я должен использовать.Сначала я скажу, что мне нужно.По сути, мне нужен контейнер, который может хранить X номер объекта (а количество объектов неизвестно, это может быть 1 - 50k).

Я много читаю, здесь массив против списка он говорит: массив должен быть изменен, если число объектов неизвестно (я не уверен, как изменить размер массива в C ++), и он также заявил, что при использовании связанного списка, если вы хотите найти определенный элемент, онбудет проходить (итерацию) от начала до конца (или наоборот), в то время как массив может указывать «объект массива по индексу».

Затем я выбрал другое решение, карту, вектор и т. д. Как этот: массив против вектора .Некоторые респонденты говорят, что никогда не используйте массив.

Я новичок в C ++, раньше я использовал только массив, вектор, список и карту.Теперь, для моего случая, какой контейнер вы порекомендуете мне использовать?Позвольте мне перефразировать мои требования:

  • Нужно быть контейнером
  • Количество сохраненных объектов неизвестно, но огромно (возможно, 1 - 40 КБ)
  • Мне нужноперебрать контейнеры, чтобы найти конкретный объект

Ответы [ 5 ]

6 голосов
/ 11 августа 2011

std :: vector - это то, что вам нужно.
При выборе контейнера stl необходимо учитывать две вещи.

  1. Данные, которые вы хотите сохранить
  2. Операции, которые вы хотите выполнить с сохраненными данными

В вопросе о SO здесь была хорошая диаграмма, котораяDepitcs это, я не могу найти ссылку на него, но я сохранил это давно, вот оно: STL container selection flow chart

1 голос
/ 11 августа 2011

Общее правило: используйте std::vector до тех пор, пока оно не сработает, затем перейдите к тому, что работает. Существуют всевозможные теоретические правила о том, какое из них лучше, в зависимости от операций, но я регулярно обнаруживаю, что std::vector превосходит другие, даже когда самые частые операции - это вещи, где std::vector предположительно хуже. Местность кажется более важной, чем большинство теоретических соображений на современной машине.

Единственная причина, по которой вы можете перейти от std::vector, заключается в правильности итератора. Вставка в std::vector может сделать недействительными итераторы; вставка в std::list никогда.

1 голос
/ 11 августа 2011

Вы не можете изменить размер массива в C ++, не зная, откуда вы его взяли Контейнер, который вам нужен - это std :: vector.

0 голосов
/ 11 августа 2011

Вы можете использовать vector .Но если вам нужно найти объекты в контейнере, рассмотрите возможность использования set , multiset или map .

0 голосов
/ 11 августа 2011

Вам нужно перебрать контейнер, или у вас есть ключ или идентификатор для ваших объектов?

Если у вас есть ключ или идентификатор - вы можете использовать map, чтобы иметь возможность быстрого доступа квозражать против этого, если id является простым индексом - тогда вы можете использовать vector.

В противном случае вы можете перебирать любой контейнер (у всех есть итераторы), но list будет лучшим, если вы хотитедля экономии памяти и vector, если вы хотите ориентироваться на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...