【发布时间】:2010-08-24 12:09:28
【问题描述】:
我需要将HANDLE 类型的实例保存到数组容器中并对其进行迭代,最后在必要时删除其中一些,
为了方便起见,我应该使用哪个容器?
【问题讨论】:
-
选择取决于句柄的数量是固定的还是动态的?
-
你想从哪里移除元素?结束还是中间?
-
我会迭代容器,如果发现句柄已关闭,则将其移除。
我需要将HANDLE 类型的实例保存到数组容器中并对其进行迭代,最后在必要时删除其中一些,
为了方便起见,我应该使用哪个容器?
【问题讨论】:
最好的方法取决于您将如何访问它以及您将从何处删除元素。
std::vector 通常应该是您的默认选择。在这里,您可以遍历 HANDLE 元素并且存储效率很高。擦除时可能会出现矢量问题。如果您要从容器中间删除元素,则 vector 不如 list 或 set 之类的有效,并且它将使您正在擦除的元素之外的所有迭代器无效。请注意,从中间擦除时,列表比向量更高效,但列表的空间效率并不高。我通常只使用列表作为最后的手段。如果您只需要从容器末端有效地移除,那么使用列表的一个不错的选择是 deque 容器。
如果您需要对数据进行排序(即不使用 std::sort 之类的东西对向量进行排序),您希望在不使其他迭代器无效的情况下从任何地方删除,那么集合可能正是您正在寻找的。
应该注意的是,我假设您的 HANDLE 类是一个指针,或者是一个符合 C++ std 容器中存储标准的类。 (复制语义等)如果使用指针,那么您将负责关闭和/或释放指针所指的资源。这应该通过一些 RAII 类来完成。您不应该为此使用 auto_ptr,因为它不符合存储在标准容器中的要求。但是,您可以使用 Boost 库提供的 shared_ptr 类。
这里有一些 general info 所有这些容器以及 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;
}
【讨论】:
vectore 为HANDLE?它是线程安全的吗?
我可能会使用std::vector<HANDLE>。更好的是围绕 HANDLE 创建一个类,其析构函数处理关闭它——你需要引用计数它。
【讨论】:
【讨论】:
当您同时从容器中间移除手柄时, 所以最好将 List 用于您的用例。
【讨论】: