C++:用于超重对象的方便的基于指针数组的值迭代器

Posted

技术标签:

【中文标题】C++:用于超重对象的方便的基于指针数组的值迭代器【英文标题】:C++: Convenient pointer array based value iterator for super-heavy objects 【发布时间】:2015-09-09 21:51:47 【问题描述】:

在我的代码中,我有这样的东西:

vector<SuperHeavyObject> objects; // objects in this vector are extremely slow to copy!
for (auto &objectGroup : objectGroups) 
    vector<SuperHeavyObject> objectsInThisGroup;
    for (size_t index : objectGroup) 
        objectsInThisGroup.push_back(objects[index]); // slow as copying is needed!
    
    doSomething(objectsInThisGroup.begin(), objectsInThisGroup.end());

我真正想要的是这样的:

vector<SuperHeavyObject> objects; // objects in this vector are extremely slow to copy!
for (auto &objectGroup : objectGroups) 
    vector<SuperHeavyObject*> objectsInThisGroup; // pointers!
    for (size_t index : objectGroup) 
        objectsInThisGroup.push_back(&objects[index]); // not slow anymore
    
    doSomething(magicIterator(objectsInThisGroup.begin()), 
                magicIterator(objectsInThisGroup.end()));

doSomething 被允许复制对象,所以没有范围问题。 doSomething 内部是我唯一希望进行复制的地方,因为这些对象的复制速度确实非常慢(我已经分析过,这是一个瓶颈)。

同时,我不想更改doSomething 的签名以接受取消引用SuperHeavyObject* 的迭代器,因为这需要进行大量更改;取消对SuperHeavyObject 的引用是理想的,因为它只会发生在一个地方(复制发生的地方)。

我的问题是;我可以自己写一个这样的迭代器,但感觉就像我在重新发明***。 C++ (11) 有能力做到这一点吗?如果有人知道这样的事情,我也有 Boost。

【问题讨论】:

可能更好地查找 vector&lt;std::shared_ptr&lt;SuperHeavyObject&gt;&gt; 之类的内容。迭代实现听起来像是你在叫错树。 这是一个措辞恰当、可回答的问题,正在寻找针对合法要求的标准提供的解决方案,我真的无法理解反对票和接近票。 【参考方案1】:

似乎是std::reference_wrapper1 的合法用例:

vector<SuperHeavyObject> objects;
for (auto &objectGroup : objectGroups) 
    vector<std::reference_wrapper<SuperHeavyObject>> objectsInThisGroup;
    for (size_t index : objectGroup) 
        // fast, we are only storing reference-like objects
        objectsInThisGroup.push_back(objects[index]);
    
    doSomething(objectsInThisGroup.begin(), objectsInThisGroup.end());


    需要 C++11

【讨论】:

【参考方案2】:

感谢@matteo-italia 的有用回答!我使用了一段时间,并决定仔细研究 Boost 的迭代器,我发现它们有一个 indirect_iterator,这也是做我想做的事的好方法。

"indirect_iterator 通过在 operator*() 内部应用额外的解引用来适应迭代器"

http://www.boost.org/doc/libs/1_59_0/libs/iterator/doc/indirect_iterator.html

【讨论】:

以上是关于C++:用于超重对象的方便的基于指针数组的值迭代器的主要内容,如果未能解决你的问题,请参考以下文章

使用条目和迭代器来构建数组。

指向对象的指针映射上的迭代器作为关键 C++

C++详解stl迭代器 (vector迭代器失效问题)

C++中的迭代器

C++ 迭代器是指针吗

C++ 字符串向量和数组的一些术语