[英]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.