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_wrapper
1:
的合法用例
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
感谢@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
在我的代码中,我有这样的东西:
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_wrapper
1:
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
感谢@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