Что проще всего использовать динамический массив в C / C ++ в Windows XP? - PullRequest
0 голосов
/ 24 августа 2010

Мне нужно сохранить экземпляры типа HANDLE в контейнере массива и выполнить итерацию по нему, наконец, при необходимости, удалить некоторые из них,

Какой контейнер следует использовать для удобства?

Ответы [ 4 ]

2 голосов
/ 24 августа 2010

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

std :: vector обычно должен быть вашим выбором по умолчанию. Здесь вы можете перебирать элементы HANDLE и хранилище эффективно. Проблема с вектором может возникнуть, когда вы стираете. Если вы удаляете элементы из середины контейнера, вектор не так эффективен, как что-то вроде list или set , и он сделает недействительными все итераторы, кроме стираемого вами элемента. Обратите внимание, что списки более производительны, чем вектор, при удалении из середины, но список не очень экономит место. Я обычно использую список только в крайнем случае. Хорошим вариантом использования списка является контейнер deque , если вам нужно только эффективное удаление с концов контейнера.

Если вам нужны отсортированные данные (т.е. без использования чего-то вроде std :: sort для сортировки вектора), вы хотите удалить их из любого места без аннулирования других итераторов, тогда набор может быть именно тем, что вы ищете.

Следует отметить, что я предполагаю, что ваш класс HANDLE является либо указателем, либо классом, который соответствует критериям для хранения в стандартном контейнере C ++. (Копировать семантику и т. Д.) Если вы используете указатель, вы будете нести ответственность за закрытие и / или освобождение ресурса, на который ссылается указатель. Это должно быть сделано через некоторый класс RAII. Вы НЕ ДОЛЖНЫ использовать auto_ptr для этого, так как он не соответствует требованиям для хранения в стандартном контейнере. Однако вы можете использовать класс shared_ptr , предоставляемый библиотеками Boost .

Вот некоторая общая информация все эти контейнеры и другие опции контейнеров, доступные в C ++.

Вот простой пример использования вектора со справочных страниц. Вы можете легко взять это и произвести то, что вы хотите, с помощью вашего класса / ручки HANDLE. Я добавил пример цикла, печатающего содержимое через итераторы.

// erasing from vector
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  unsigned int i;
  vector<unsigned int> myvector;

  // set some values (from 1 to 10)
  for (i=1; i<=10; i++) myvector.push_back(i);

  // erase the 6th element
  myvector.erase (myvector.begin()+5);

  // erase the first 3 elements:
  myvector.erase (myvector.begin(),myvector.begin()+3);

  cout << "myvector contains:";
  for (i=0; i<myvector.size(); i++)
  {
      cout << " " << myvector[i];
  }
  cout << endl;

  // Using iterators
  cout << "myvector contains (using iterators):";
  for (vector<unsigned int>::const_iterator it = myvector.begin();
       it != myvector.end();
       ++it)
  {
      cout << " " << *it;
  }
  cout << endl;
  return 0;
}
0 голосов
/ 24 августа 2010

Поскольку вы также удаляете ручку из середины контейнера, лучше использовать List для вашего варианта использования.

0 голосов
/ 24 августа 2010

как насчет использования списка?
http://www.cplusplus.com/reference/stl/list/

0 голосов
/ 24 августа 2010

Я бы, наверное, использовал std::vector<HANDLE>. Еще лучше было бы создать класс вокруг HANDLE, деструктор которого имеет дело с его закрытием - вам нужно сосчитать его.

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