【问题标题】:Using a pointer to an object stored in a vector... c++使用指向存储在向量中的对象的指针... c++
【发布时间】:2009-03-16 12:33:38
【问题描述】:

我在全局范围内有一个 myObjects 向量。

std::vector<myObject>

一个方法被传递一个指向向量中元素之一的指针。 这个方法可以增加指针,以到达下一个元素,

myObject* pmObj;

++pmObj; // the next element ??

还是应该传递std::Vector&lt;myObject&gt;::iterator 并增加它?

现在假设向量在此期间不会改变。

【问题讨论】:

  • 如何获得指向元素的指针?
  • Krakkos,请注意,您也可以随时从迭代器中获取指向元素的指针,方法是使用 &*it;

标签: c++ pointers iterator stdvector


【解决方案1】:

是的 - 标准在技术更正中保证向量的存储是连续的,因此将指针递增到向量中是可行的。

【讨论】:

【解决方案2】:

是的,这将按预期工作,因为标准要求std::vector 使用连续存储。如果您正在处理一系列对象,我建议您传入一对迭代器。这几乎是 STL 使用的标准习语。这也将使您的代码更安全一些,因为您有一个明确的迭代端点,而不是依赖于计数或类似的东西。

【讨论】:

  • 因为向量是全局的,我可以将 myObt 指针与 myObjectVecor.end() 进行比较;
  • 我不确定这是否真的安全...要使其正常工作,需要 "&vec.back()" 或 "&*vec.end()"超出连续空间末端的对象,我不认为这是标准中的保证。
【解决方案3】:

如果向量没有重新分配并且您确定不会超出向量的范围,那么您可以使用这种方法。递增指针是合法的,当您有空间移动到下一个元素时,您可以通过递增指针来实现,因为向量的缓冲区是单个内存块。

【讨论】:

  • 是的,vecotr 不会被重新分配,但最终我可以达到向量边界...我可以在使用之前检查 pmyObj == myObjectVector.end() 吗?
  • 至少你可以用VC++实现。
  • pObj == vec.end() 仅当向量迭代器只是一个 typedef T* 时才有效,但不能保证。 vector 不提供对其内部指针的直接访问,并且您不能取消引用 vec.end() 所以唯一可以检查原始指针与 end (&vec[0] + vec.size()) 的时间是 vec.end()。大小() >= 1.
猜你喜欢
  • 1970-01-01
  • 2021-05-20
  • 2012-09-25
  • 2011-10-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多