c++ - 在 Windows XP 中使用 C/C++ 中的动态数组最简单的方法是什么?

标签 c++ arrays iterator

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

为了方便起见,我应该使用哪个容器?<​​/p>

最佳答案

最好的一个将取决于您将如何访问它以及您将从哪里删除元素。

std::vector通常应该是您的默认选择。在这里您可以迭代 HANDLE 元素并且存储是高效的。删除时可能会出现 vector 问题。如果要从容器中间移除元素,vector 的效率不如 list。或 set它将使您正在删除的元素之外的所有迭代器无效。请注意,从中间删除时,列表比 vector 的性能更高,但列表的空间效率不是很高。我通常仅将列表用作最后的手段。使用列表的一个很好的选择是 deque容器,如果您只需要从容器的末端高效移除。

如果您需要对数据进行排序(即不使用 std::sort 之类的东西对 vector 进行排序),您想从任何地方删除而不会使其他迭代器失效,那么集合可能正是您要找的。

应该注意的是,我假设您的 HANDLE 类是一个指针,或者是一个符合 C++ std 容器中存储标准的类。 (复制语义等)如果使用指针,那么您也将负责关闭和/或释放指针所引用的资源。这应该通过一些 RAII 类来完成。你不应该为此使用 auto_ptr,因为它不符合存储在标准容器中的要求。但是,您可以使用 shared_ptr Boost 提供的类图书馆。

这是一些 general info所有这些容器和 C++ 中可用的其他容器选项。

这是一个简单的示例,说明如何使用引用页面中的 vector 。您可以轻松地使用它并使用 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;
}

关于c++ - 在 Windows XP 中使用 C/C++ 中的动态数组最简单的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3556241/

相关文章:

c++ - 未知的 nvlink 错误

javascript - 更新数组中对象的更干净的方法

javascript - 我如何在 JavaScript 中准备嵌套键值对列表

java - 幸运数字程序未显示正确答案

c++ - 如何使用运行参数从模板实例化对象数组

c++ - 在 Qt 中创建和存储调查

C++ 类 - 如何从函数返回自定义类型的 vector ?

c++ - range-v3:调整已经实现迭代器接口(interface)的自定义类(开始/结束)

c++ - 自动,错误 : map iterator has no member named ‘first`

c++ - 如何打印 QStringListModel 内容?