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

C++: Convenient pointer array based value iterator for super-heavy objects

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

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。

似乎是 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());
}

  1. 需要 C++11

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

"indirect_iterator adapts an iterator by applying an extra dereference inside of operator*()"

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