【问题标题】:What's the easiest go to use dynamic array in c/c++ in windows xp?在 windows xp 的 c/c++ 中使用动态数组最简单的方法是什么?
【发布时间】:2010-08-24 12:09:28
【问题描述】:

我需要将HANDLE 类型的实例保存到数组容器中并对其进行迭代,最后在必要时删除其中一些,

为了方便起见,我应该使用哪个容器?

【问题讨论】:

  • 选择取决于句柄的数量是固定的还是动态的?
  • 你想从哪里移除元素?结束还是中间?
  • 我会迭代容器,如果发现句柄已关闭,则将其移除。

标签: c++ arrays iterator


【解决方案1】:

最好的方法取决于您将如何访问它以及您将从何处删除元素。

std::vector 通常应该是您的默认选择。在这里,您可以遍历 HANDLE 元素并且存储效率很高。擦除时可能会出现矢量问题。如果您要从容器中间删除元素,则 vector 不如 listset 之类的有效,并且它将使您正在擦除的元素之外的所有迭代器无效。请注意,从中间擦除时,列表比向量更高效,但列表的空间效率并不高。我通常只使用列表作为最后的手段。如果您只需要从容器末端有效地移除,那么使用列表的一个不错的选择是 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;
}

【讨论】:

  • 您能否提供一个示例如何使用vectoreHANDLE?它是线程安全的吗?
  • 很棒的提示!似乎我不需要遍历所有项目,对吧?另外,它是线程安全的吗?
  • std::vector 是线程安全的,但不可重入。 en.wikipedia.org/wiki/Thread_safety
  • 我一直认为线程安全和可重入是一回事,这两个概念有什么区别?
  • 标准没有保证 STL 容器是线程安全的。 (包括向量)这是特定于实现的。您可以在此处找到有关 std 容器中线程安全的更多信息:stackoverflow.com/questions/1362110/…
【解决方案2】:

我可能会使用std::vector&lt;HANDLE&gt;。更好的是围绕 HANDLE 创建一个类,其析构函数处理关闭它——你需要引用计数它。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 一个列表会起作用,但如果 HANDLE 只是在典型的指针上,那么对于每个元素,相对于要存储的对象的大小,您都会有相当多的开销。这是因为每个元素将至少包含指向列表中前一个和下一个元素的指针,因为列表是作为双向链表实现的。这种空间使用确实允许从中间快速移除,并且不会使下面的其他迭代器 b/c 无效,它只是重新分配一些指针。 (即周围元素的下一个和上一个)
    【解决方案4】:

    当您同时从容器中间移除手柄时, 所以最好将 List 用于您的用例。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2012-12-14
      • 2012-05-02
      • 1970-01-01
      • 2011-03-21
      • 2010-09-23
      相关资源
      最近更新 更多