Лучший из них будет зависеть от того, как вы собираетесь получить к нему доступ и откуда вы собираетесь удалять элементы.
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;
}