C++:用于超重对象的方便的基于指针数组的值迭代器
Posted
技术标签:
【中文标题】C++:用于超重对象的方便的基于指针数组的值迭代器【英文标题】:C++: Convenient pointer array based value iterator for super-heavy objects 【发布时间】: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>>
之类的内容。迭代实现听起来像是你在叫错树。
这是一个措辞恰当、可回答的问题,正在寻找针对合法要求的标准提供的解决方案,我真的无法理解反对票和接近票。
【参考方案1】:
似乎是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
【讨论】:
【参考方案2】:感谢@matteo-italia 的有用回答!我使用了一段时间,并决定仔细研究 Boost 的迭代器,我发现它们有一个 indirect_iterator
,这也是做我想做的事的好方法。
"indirect_iterator 通过在 operator*() 内部应用额外的解引用来适应迭代器"
http://www.boost.org/doc/libs/1_59_0/libs/iterator/doc/indirect_iterator.html
【讨论】:
以上是关于C++:用于超重对象的方便的基于指针数组的值迭代器的主要内容,如果未能解决你的问题,请参考以下文章