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

标签 c++ pointers iterator copying

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

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

关于C++:用于超重对象的方便的基于指针数组的值迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32489734/

相关文章:

c++ - 为什么 range::unique_copy 不能与 std::ostream_iterator 一起使用?

c++ - C++20 中概念约束函数的排序规则是什么?

C++代码可视化

使用 C 中的结构和指针更改图像大小/分辨率

java - 防止在 Java 中分配 ArrayList 迭代器

c++ - 使用迭代器从两端开始在列表中移动并在中间停止

c++ - 如何以原子方式否定 std::atomic_bool?

c++ - Ogre3d 具有唯一节点名称错误

c - 为什么我的结构体指针忘记了字符串?

c - 为什么指针 (*) 和数组 ([]) 符号绑定(bind)到变量名而不是键入变量声明?