繁体   English   中英

C ++:从只能通过迭代器访问的数据类型中有效地提取元素子集

[英]C++: Efficiently extracting a subset of elements from a datatype that only has access via an iterator

我有另一个用户定义的数据结构(用于处理网格)。 对底层元素的唯一公共访问是通过迭代器(不可能直接访问“元素”x)。

我还有一个元素索引列表,存储为我要提取的std :: vector,其中我将迭代器访问的第一个元素定义为index = 1,index = 2等。有效地我想要提取基于索引的元素子集。

我将这么做很多次(我正在采样的网格将不断变化,我想继续采样相同的索引),因此我需要尽可能有效的方法。

目前,我真的想不出比将所有元素添加到std :: vector更有效的方法,然后循环遍历元素索引列表并选择所有必需的元素。 理想情况下,出于时间和存储的原因,这似乎不是一种非常简洁的方法。

任何建议将不胜感激。

如果事先对矢量进行了排序,那么您只需要迭代一次。 您需要自己维护第三方迭代器中的计数。 尝试以下代码的变体。 (注意:此代码缺少错误和边界检查。)

iterator elementIt;
int elementPos = 0;

vector<int> extractElements;
for (vector<int>::iterator extractIt = extractElements.begin(); extractIt != extractElements.end(); ++extractIt)
{
  while (elementPos < *extractIt)
  {
    ++elementIt;
    ++elementPos;
  }

  doSomething(elementIt);
}

假设您可以通过现有iterator对象的偏移量(即通过begin() getter方法)访问公开的iterator对象,您可能能够执行以下操作

DataStructure_type::iterator iter = dataStructureVar.begin();
elementValue = *(iter + idx);

其中DataStructure_type是可迭代数据结构的类型,而idx是您想要的元素的索引。 然后,从数据结构中提取元素的子集变得如此简单:

DataStructure_type::iterator subsetStartIter = dataStructureVar.begin() + subsetStartIdx;
DataStructure_type::iterator subsetEndIter = dataStructureVar.begin() + subsetEndIdx;
std::vector<Element_type> subsetCollection(subsetStartIter, subsetEndIter);

但是,如果直接在代码中的原始子集iterator对象上操作而不是将它们复制到中间容器,则可能更有效 - 这将消除将子集复制到std::vector<> ...

请注意,这个答案是对DataStructure_type公开的iterator对象的实现做出某些假设,并没有考虑边界检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM