2011-09-05 76 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;