2011-09-05 3 views
0

다음과 같이 구조가 있습니다 :STL 벡터에서 개체를 조작?

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

그리고 다음과 같이 STL 벡터에 요소를 저장합니다 :

 std::vector <Rz3DContourNode> nodes; 

이제 노드의 nx, ny 구성을 벡터에 변경하고 싶습니다. 다음과 같이 시도 :

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

이 작동하지 않았다. 노드 [i] 개체 복사본을 반환하기 때문에 때문입니까?

포인터를 사용하여 예상되는 모든 솔루션이 있습니까?

편집 - 미안 해요. 실제로 QList 유지하고 std :: vector 얻을 때마다 벡터를 사용하여 포인터 (Rz3DContourNode *), 사용할 수 없습니다. 그것이 이유였습니다

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

'노드가 [내가]'개체의 복사본을 반환하지 않습니다 당신이 게시 할 수 : 그래서이

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

여기

nodes[i].nx = newNXValue; 

로 대체 내가 노력 코드 샘플입니다 일부 실패한 코드? '* (& nodes [i] .nx) = newNXValue;'는 노드 [i] .nx = newNXValue;로 간략화 될 수 있어야한다. –

+0

고마워, 매번 벡터 복사본을 얻고 있었어. 그게 이유야. –

답변

2

.... 을하고 그것을 모든 일을하지 동일 역 참조 할 수 있습니다. 그래서 필요하지 않습니다.

#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; 
관련 문제