2011-09-05 75 views
0

我的结构是这样的:C++ - 操纵STL向量中的对象?

struct Rz3DContourNode { 
    float x; 
    float y; 
    float z; 
    float nx; 
    float ny; 
    float nz; 
}; 

我存储在一个STL向量元素如下:

std::vector <Rz3DContourNode> nodes; 

现在我想改变NX,在矢量节点纽约compoent。我尝试如下:

*(&nodes[i].nx)=newNXValue; 
*(&nodes[i].ny)=newNYValue; 
*(&nodes[i].nz)=newNZValue; 

这没有工作。是因为节点[我]返回对象的副本?

有没有这种期望使用指针的解决方案?

我不能使用指针(Rz3DContourNode *),因为我在OpenGL中使用该载体作为

glNormalPointer(GL_FLOAT,sizeof(Rz3DContourNode), &nodes[0].nx); 

编辑 - 我很抱歉。其实保持的QList和获得的std ::向量每次。这就是原因

std::vector<Rz3DContourNode> nodeVector = nodes.toVector().toStdVector(); 
+5

'节点[I]'不返回对象的副本,你可以发布一些失败的代码? '*(&nodes [i] .nx)= newNXValue;'可以/应该简化为'nodes [i] .nx = newNXValue;'。 –

+0

谢谢,我每次都得到了这个向量的副本。这就是原因。 –

回答

2

它适用于我的编译器.... 以实例的地址,然后解引用它一样不会做这一切。 所以你不需要它。因此,这

*(&nodes[i].nx)=newNXValue; 

nodes[i].nx = newNXValue; 

这里取而代之的是代码示例我想:

#include "stdafx.h" 
#include <stdio.h> 
#include <vector> 

struct Rz3DContourNode { 
    float x; 
    float y; 
    float z; 
    float nx; 
    float ny; 
    float nz; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector <Rz3DContourNode> nodes; 
    float newNXValue = 4545.4f; 
    float newNYValue = 453.0f; 
    float newNZValue = 34.0f; 

    for (int i = 0; i < 3; i++) 
    { 
     Rz3DContourNode node = {1.0f,1.0f,1.0f,1.0f,1.0f,1.0f}; 
     nodes.push_back(node); 
    } 

    for (int i = 0; i < nodes.size(); i++) 
    { 
     nodes[i].nx = newNXValue; 
     nodes[i].ny = newNYValue; 
     nodes[i].nz = newNZValue; 
    } 

    return 0; 
} 
+0

对不起,我正在做一些非常错误的事情。我每次都得到一个向量的副本(来自QList) –

+1

有时你整天呆在这里,直到你问别人为止帮帮我。然后当你将问题转述给其他人时,答案突然变得清晰。如果你喜欢这个答案,那就投票吧。 –

+0

当然,投票!谢谢 –

11

为什么要用指针?该[]操作返回到存储对象的引用,所以你可以做

nodes[i].nx = newNXValue; 
nodes[i].ny = newNYValue; 
nodes[i].nz = newNZValue;