gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:12:05 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com