【发布时间】: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<std::shared_ptr<SuperHeavyObject>>之类的内容。迭代实现听起来像是你在叫错树。 -
这是一个措辞恰当、可回答的问题,正在寻找针对合法要求的标准提供的解决方案,我真的无法理解反对票和接近票。
标签: c++ pointers iterator copying