有 vector<object>;返回 vector<object.member> 而不复制
Have vector<object>; return vector<object.member> without copying
我有一个对象的std::向量:
std::vector<Character>
其中
class Character{
....
Vector position;
Vector velocity;
Vector force;
double mass;
};
我只需要特定的成员值(位置)来绘制我的场景。有没有什么快速的方法可以访问对象向量中的某个成员?我宁愿避免像这样的循环
std::vector<Vector> tmp;
for(int i=0; i<vect.size(); i++)
tmp.push_back(vect[i].position);
因为我不认为经常复制元素有什么意义,尤其是当有很多元素的时候。
如果您关心性能,即当只需要一个小对象(Vector
)时缓存大对象(如Character
)的开销,您应该考虑将您的设计从结构的阵列(AoS)更改为结构:
class Characters {
std::vector<Vector> positions;
std::vector<Vector> velocities
std::vector<Vector> forces;
std::vector<double> masses;
...
};
并定义一些类似迭代器的类来表示单个字符(当然这必须是Characters
的friend
)
class Character {
Characters* const C;
std::size_t I;
public:
Vector const&position() const { return C->positions[I]; }
Vector &position() { return C->positions[I]; }
...
};
这确实会加快速度。
通过引用调用函数不会生成副本:
void Draw(vector<Character>& characters) {
// Render from the referenced vector, no copies made
}
int main(int argc, char* argv[]) {
vector<Character> characters;
// Generate characters in vector
Draw(characters);
return 0;
}
评论后编辑:
class GraphicalContext {
// Add needed stuff
};
class Drawable {
virtual ~Drawable() {}
virtual void Draw(GraphicalContext& gc) = 0;
};
class Tree : public Drawable {
void Draw(GraphicalContext& gc) {
// Draw the tree
}
};
class Character : public Drawable {
void Draw(GraphicalContext& gc) {
// Draw the character
}
};
typedef vector<Drawable*> Objects_t;
void RenderWorld(GraphicalContext& gc, Objects_t& objects) {
Objects_t::iterator iter = objects.begin();
for(; iter != objects.end(); ++iter) {
(*iter)->Draw(gc);
}
}
int main(int argc, char* argv[]) {
Objects_t objects;
// Insert objects into objects vector
GraphicalContext gc;
RenderWorld(gc, objects);
return 0;
}
相关文章:
- EASTL矢量<向量<int>>连续的
- 当覆盖存在时调用基本虚拟"binded to object"函数
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 现代C++会支持 C# "Object Initalizer"语法吗?
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- C++ Equivalent of Java Map<String, Object>
- WebKit2GTK+ "window-object-cleared"未清除
- 返回 *&object 时是否允许复制/移动省略?
- QPointer::clear() 是删除其引用的指针,还是"Clears this QPointer object."其他含义?
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型