C++ 向量操作优化

Posted

技术标签:

【中文标题】C++ 向量操作优化【英文标题】:C++ vector manipulation optimization 【发布时间】:2009-07-16 18:17:29 【问题描述】:

我正在尝试优化下面的代码,以避免复制和粘贴,只需正确使用 SlaveForce 和 SlavePos,它们是 float[6] 类型,而 baseForce 和 basePos 是矢量类型:

typedef struct _NodeCoord

    float coords[6];
 NodeCoord;

int main()

    ...
    memcpy(tempNodeCoord.coords, SlaveForce, 6*sizeof(float));
    baseForce.push_back(tempNodeCoord);
    memcpy(tempNodeCoord.coords, SlavePos, 6*sizeof(float));
    basePos.push_back(tempNodeCoord);
    ...

我已经尝试了一些测试代码。只有这似乎有效:

std::vector<NodeCoord> tallon;
NodeCoord m;
memset(m.coords, 0, sizeof(m.coords));
tallon.push_back(m);

虽然这符合我想要完成的目标,但它不起作用:

std::vector<float[6]> ed;
float e[6];
tallon.push_back(e);

我也试过写一个“typedef float[6] mytype;”在 main 函数之前的行,但它也不能很好地工作。我可以做些什么来消除 memcpy 函数调用(或者直接 push_back 浮点 [6] 变量)?提前致谢。

【问题讨论】:

【参考方案1】:

尝试一个向量的向量:

std::vector<std::vector<float> > ed;

ed.push_back(std::vector<float>(6, 0.0f));

在这种情况下,我正在推送一个浮点临时向量,其中包含 6 个值为 0.0f 的元素;

Info on vector's constructors.

【讨论】:

【参考方案2】:

这是c++,为什么不试试上课呢?

class NodeCoord  
public:
    float coords[6];
    NodeCoord() memset(coords, 0, sizeof(coords));;
    ~NodeCoord() ;
;

std::vector<NodeCoord> tallon;
tallon.push_back(NodeCoord());

cout << tallon.front().coords[0];

如果您愿意,您还可以在课堂上做更多事情。如果您希望避免复制,只需在复制构造函数中制作类的浅拷贝即可。

【讨论】:

【参考方案3】:

为了可以存储在向量中,类型必须是可复制和可分配的,而 C 样式的数组两者都不是。您应该改用另一个向量,或者可能将数组包装在结构中。

【讨论】:

使用另一个向量和将数组包装在一个结构中(这就是我已经在做的)有什么区别? 包装后的数组可能会更快,但灵活性较差 - 例如,您无法找到数组中实际有多少东西。 我不能使用 sizeof(array)/sizeof(element) 找出数组中有多少元素吗? 在很多情况下这根本行不通。如果它这样做了,它只会告诉你数组的大小,而不是它包含多少实际值。 在清洁度方面,第一种方法是否提供更好的可读性?

以上是关于C++ 向量操作优化的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中操作向量时出现分段错误

合并排序的合并操作不使用 C++ 向量

在 C++ 中对自定义对象的向量进行操作 [关闭]

C++ 轴对齐矩形操作向量和字符串

使用 C++ void 函数操作向量数组

当函数返回它时,C++ 向量实例是可操作的